go - 在 Go 中将图像编码为 JPEG

标签 go jpeg imaging

我有一个名为 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 库:

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

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

我犯错了:

图片:未知格式

有什么想法吗?

最佳答案

因此,看起来这可能是 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
}

关于go - 在 Go 中将图像编码为 JPEG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39577318/

相关文章:

firebase - FCM HTTP v1 : how to get access token using Go?

c# - C#套接字发送图片JPEG

python - 如何使用 pydicom 创建 JPEG 压缩 DICOM 数据集?

go - 是否可以在 Go 代码中包含内联汇编?

reflection - 我们如何使用空接口(interface)指向的实际类型在 Go 中创建该类型的新实例?

c++ - 从一个文件中读取多个 jpg 图像

metadata - 从UIImagePickerControlleHow的结果中,如何获取包含元数据的JPEG?

c++ - DirectX 部分屏幕捕获

python - 使用 PIL 检测空白页扫描

html - 如何在Golang中通过添加section标签将markdown转换为HTML