圍棋

2016-09-19 87 views
0

編碼的圖像以JPEG我有一個名爲SpriteImage結構,其定義是這樣的:圍棋

type SpriteImage struct { 
    dimentions  image.Point 
    lastImgPosition image.Point 
    sprite   *image.NRGBA 
} 

在我的流程,我先啓動新的這樣的結構:

func NewSpriteImage(width, height int) SpriteImage { 
    c := color.RGBA{0xff, 0xff, 0xff, 0xff} 
    blankImage := imaging.New(width, height, c) 

    return SpriteImage{ 
     dimentions:  image.Point{X: width, Y: height}, 
     lastImgPosition: image.Point{X: 0, Y: 0}, 
     sprite:   blankImage, 
    } 
} 

然後我將圖像添加到這個SpriteImage像這樣:

func (s *SpriteImage) AddImage(img image.Image) error { 
    imgWidth := img.Bounds().Dx() 
    imgHeight := img.Bounds().Dy() 

    // Make sure new image will fit into the sprite. 
    if imgWidth != s.dimentions.X { 
     return fmt.Errorf("image width %d mismatch sprite width %d", imgWidth, s.dimentions.X) 
    } 

    spriteHeightLeft := s.dimentions.Y - s.lastImgPosition.Y 
    if imgHeight > spriteHeightLeft { 
     return fmt.Errorf("image height %d won't fit into sprite, sprite free space %d ", imgHeight, s.dimentions.Y) 
    } 

    // add image to sprite 
    s.sprite = imaging.Paste(s.sprite, img, s.lastImgPosition) 

    // update next image position within sprite 
    s.lastImgPosition = s.lastImgPosition.Add(image.Point{X: 0, Y: imgHeight}) 

    return nil 
} 

最後,我想借此SpriteImage,並對其進行編碼,作爲JPEG。但它似乎並不奏效。 native JPEG Encode function拍攝了一張圖片,但我有一張image.NRGBA。所以我使用github.com/disintegration/imaging lib中,像這樣:

func (s SpriteImage) GetBytes() ([]byte, error) { 
    var b bytes.Buffer 
    w := bufio.NewWriter(&b) 

    if s.sprite == nil { 
     return nil, fmt.Errorf("sprite is nil") 
    } 

    if err := imaging.Encode(w, s.sprite, imaging.JPEG); err != nil { 
     return nil, err 
    } 

    return b.Bytes(), nil 
} 

但是似乎是返回的字節事實上並非JPEG。本地Go JPEG lib不會將這些字節解碼爲Go圖像結構。如果我試圖像這樣這些字節解碼圖像:

 m, _, err := image.Decode(reader) 
    if err != nil { 
     log.Fatal(err) 
    } 

我得到錯誤:

image: unknown format

任何想法?

回答

0

也許一些覈查:image: unknown format是一種常見的錯誤,當您不包括image/jpeg lib和具體地說,它與它進行解碼:

import (
    "image/jpeg" 
    "io" 
) 

...  
    img, err := jpeg.Decode(r) 
    if err != nil { 
    return err 
    } 
... 

一些嘗試使用image.Decode,但你仍然需要包括image/jpeg lib。

我相信它的工作原理與盲包括:

import (
    _ "image/jpeg" 
    "image" 
    "io" 
) 

...  
    img, err := image.Decode(r) 
    if err != nil { 
    return err 
    } 
... 
+0

感謝。試過這個,沒有幫助 – orcaman

0

因此,它看起來像這可能是與github.com/disintegration/imaging LIB的問題。我在回購的頁面上發佈了一個關於它的問題。

如果我改變我的GetBytes()功能,我得到有效的JPEG:

func (s SpriteImage) GetBytes() ([]byte, error) { 
    var b bytes.Buffer 
    w := bufio.NewWriter(&b) 

    if s.sprite == nil { 
     return nil, fmt.Errorf("sprite is nil") 
    } 

    im := s.sprite 
    err := jpeg.Encode(w, im, &jpeg.Options{jpegCompression}) 

    if err != nil { 
     fmt.Println(err) 
    } 

    return b.Bytes(), nil 
}