【问题标题】:Encoding an Image to JPEG in Go在 Go 中将图像编码为 JPEG
【发布时间】:2016-09-19 15:57:39
【问题描述】:

我有一个名为 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 库不会将这些字节解码为 Go 图像结构。如果我尝试像这样将这些字节解码为图像:

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

我错了:

image: unknown format

有什么想法吗?

【问题讨论】:

    标签: go jpeg imaging


    【解决方案1】:

    所以,看起来这可能是 github.com/disintegration/imaging 库的问题。我在 repo 的页面上发布了一个关于它的问题。

    如果我将 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
    }
    

    【讨论】:

      【解决方案2】:

      也许需要检查:image: unknown format 是一个常见错误,当您不包含 image/jpeg 库并专门使用它对其进行解码时:

      import (
        "image/jpeg"
        "io"
      )
      
      ...    
        img, err := jpeg.Decode(r)
        if err != nil {
           return err
        }
      ...
      

      有些人尝试使用image.Decode,但您仍然需要包含image/jpeg 库。

      我相信它适用于盲人包括:

      import (
        _ "image/jpeg"
        "image"
        "io"
      )
      
      ...    
        img, err := image.Decode(r)
        if err != nil {
           return err
        }
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 2020-06-26
        相关资源
        最近更新 更多