gpt4 book ai didi

c++ - 了解 PNG 文件格式 IDAT 段

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:24 27 4
gpt4 key购买 nike

在下面的示例图片中,我有一个黄色边框仅用于显示目的。

实际的 .png 文件是一个简单的 3 像素 x 3 像素的黑白图像。我最初想尝试使用 2x2,但这无助于解释低/高与高/低绘图流。至少这样,我会有两个黑色,一个白色从顶部,或者一个白色,两个黑色从底部..

所以我读取数据 block ,获取 IDAT block ,对其进行解码 (zlib) 并得出 12 个字节,如下所示

00 20 00 40 00 80

那么,我的问题是,以上内容如何分解为 3x3 黑白样本...此外,它以调色板格式保存并正确识别 1 的位深度和 2 的调色板...颜色pallet[0] 是 RGBA 全零。调色板 1 RGBA 为 255, 255, 255, 0

稍后我最终会介绍其他多种深度格式,只是想从最简单的开始。

第二部分。如果需要考虑任何特殊的东西,特别是关于 alpha channel (我已经在调色板中寻找)可能会绊倒我,那么任何关于处理其他深度格式的指导都会有所帮助。

enter image description here

最佳答案

如果你使用libpng会更容易,所以我想这是出于学习目的。

问题是,如果您直接解压缩 IDAT block ,您会得到一些不应该显示和/或可能需要转换(因为应用了过滤器)以获得实际字节。在 PNG 格式中,每一行都以一个额外的字节开头,告诉您哪个过滤器应用于该行,其余字节包含行像素。

顺便说一句,00 20 00 40 00 80 只有 6 个字节(不是您认为的 12 个字节)。现在,如果您将此数据视为二进制数据,您的 3 行将如下所示:

00000000 00100000
00000000 01000000
00000000 10000000

现在,您的图像是每个像素 1 位,因此需要 1 个字节来保存一行 3 个像素。实际使用了最高 3 位(忽略了较低的 5 位)。我用 x 替换了被忽略的位,所以我认为更容易看到实际的像素(0 是黑色,1 是白色的):

00000000 001xxxxx
00000000 010xxxxx
00000000 100xxxxx

在这种情况下,没有过滤器应用于任何行,因为每行的第一个字节为零(0 表示未应用过滤器,值从 14 表示应用了过滤器)。

关于c++ - 了解 PNG 文件格式 IDAT 段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com