为了账号安全,请及时绑定邮箱和手机立即绑定

将 PNG 图像转换为原始 []byte Golang

将 PNG 图像转换为原始 []byte Golang

Go
墨色风雨 2022-11-08 16:07:24
我有一个 PNG 格式的图像,它只是一个尺寸为 1x512 的数组。我需要没有 PNG 格式的原始字节。如何在 Go 中将 PNG 转换为原始字节。我有一些 python 代码可以满足我的需求,但我无法在 Go 中找到相同的功能:image = Image.open(io.BytesIO(features))array = np.frombuffer(image.tobytes(), dtype=np.float32)
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

这是一个比您的解决方案更通用的解决方案。它使用图像本身的尺寸而不是硬编码值。


func imageToRGBA(img image.Image) []uint8 {

    sz := img.Bounds()

    raw := make([]uint8, (sz.Max.X-sz.Min.X)*(sz.Max.Y-sz.Min.Y)*4)

    idx := 0

    for y := sz.Min.Y; y < sz.Max.Y; y++ {

        for x := sz.Min.X; x < sz.Max.X; x++ {

            r, g, b, a := img.At(x, y).RGBA()

            raw[idx], raw[idx+1], raw[idx+2], raw[idx+3] = uint8(r), uint8(g), uint8(b), uint8(a)

            idx += 4

        }

    }

    return raw

}


查看完整回答
反对 回复 2022-11-08
?
慕慕森

TA贡献1856条经验 获得超17个赞

我找到了一个解决方案:


请注意,这会在 x 轴上复制图像中的值,并且 x 最大值为 512!


const FeatureVectorDimensionLength = 512


func imageToRaw(img image.Image) [2048]byte {

    var b [FeatureVectorDimensionLength*4]byte

    for i := 0; i < FeatureVectorDimensionLength; i++ {

        nrgba := img.At(i, 0).(color.NRGBA)

        idx := i*4

        b[idx], b[idx+1], b[idx+2], b[idx+3] = nrgba.R, nrgba.G, nrgba.B, nrgba.A

    }

    return b

}


查看完整回答
反对 回复 2022-11-08
  • 2 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信