【问题标题】:PNG Encode producing corrupt imagePNG编码产生损坏的图像
【发布时间】:2017-03-08 21:52:52
【问题描述】:

我正在使用 golang 从视频游戏控制台读取帧缓冲区 - 缓冲区的格式为 BRGA(然后我将其转换为 RGBA)。当我将信息传递到 Go PNG 编码器时,出来的图像无效。我正在使用的代码是 - 其中:

其中data 是一片 RGBA 像素 - 长度为 0x398000,pitch 是 5120,width 是 1270,height 是 720)

img := &image.RGBA{
    Pix:    data,
    Stride: pitch,
    Rect:   image.Rect(0, 0, width, height),
}

os.Remove("./img.png")
file, _ := os.Create("./img.png")
defer file.Close()
filewriter := bufio.NewWriter(file)
if err := png.Encode(filewriter, img); err != nil {
    panic(err)
}

预期的结果是:

但实际结果是(仅在 Windows 上呈现或在 Chrome 中查看时呈现......奇怪):

如果有人愿意,我已经上传了 RGBA 切片的二进制转储 - https://1drv.ms/u/s!Ak-aZ3z7Ea8KwvUsqdP5OgWpZqxsGA

【问题讨论】:

  • 我希望原始数据的大小为:1270*720*4 == 3657600 字节。提供的二进制转储的大小为 3768320(或您提到的 0x398000)。您确定提供的数据实际上只是原始像素值吗?
  • 转储的长度是 Xbox 给出的framebuffersize
  • 您能否提供有关如何获取数据转储的更多信息?如果它是原始 RGBA 像素值,您的代码应该可以工作。
  • 我通过 TCP 将命令 screenshot 发送到控制台,它返回响应 203- binary response follows,然后是正文:pitch=0x width=0x height=0x format=0x offsetx=0x offsety=0x, framebuffersize=0x sw=0x sh=0x colorspace=0x。我使用该信息读取响应的其余部分并将其解调为正确的像素格式。

标签: image go png


【解决方案1】:

您没有刷新缓冲的写入器。你应该这样做:

filewriter := bufio.NewWriter(file)
defer filewriter.Flush()

在这个修复之后,我得到了一个有效的图像:

【讨论】:

  • 我可能遗漏了一些东西,但是您发布的那张图片与我上面发布的完全一样,不是吗?
  • 哦,有趣。在 macOS 上,他发布的图像看起来完全是空的(就像一张完全透明的图像)。
  • 哦。我也注意到了类似的事情。它在 Chrome(任何操作系统)和 Windows 上都能很好地呈现。但在 macOS、Safari 和 iPhone 上,它只是透明的。也许 macOS 在渲染方面对规范更严格?将更新原始帖子。
【解决方案2】:

不是修复,我想发表评论,但由于声誉问题还不能发表,但会增加 Mac OS 的差异。

问题的 MacOS 部分似乎是新的,从最新的 10.12.3 更新或 Safari 的某些东西开始出现。我还没有缩小来源。但是,是的,Mac 系统如何对图像进行编码/解码有一些新的东西,从而导致它是透明的或灰色的。在过去的几周里,我参与的一个项目也遇到了这个问题,我仍在调查它在哪里崩溃。

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多