围棋

2016-09-19 51 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 
}