- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在下面的示例图片中,我有一个黄色边框仅用于显示目的。
实际的 .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 (我已经在调色板中寻找)可能会绊倒我,那么任何关于处理其他深度格式的指导都会有所帮助。
最佳答案
如果你使用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
表示未应用过滤器,值从 1
到 4
表示应用了过滤器)。
关于c++ - 了解 PNG 文件格式 IDAT 段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890545/
我正在研究 W3 PNG 规范(从头开始创建一个 PNG 库),我终于找到了如何创建绿色 1x1 图像的方法。 现在我正在尝试创建一个更大的混合红色、绿色和蓝色像素的图像。假设是 4x4 图像。可悲的
我想知道在 PNG 图像中使用多个 IDAT-Chunk 的好处是什么。 PNG 文档说 There may be multiple IDAT chunks; if so, they shall ap
我正在尝试手动构建一个简单的 4x1、未压缩 PNG。 到目前为止,我有: 89504E47 // PNG Header 0D0A1A0A 0000000D // byte length of I
我创建了一个 png 3x3 具有 3 种不同的颜色和 1 2x2 黑色和白色用于测试目的。 基本上我已经能够将字节的所有位分配给它们在各自 block 中的特定角色,但 IDAT block 除外(
我在 Photoshop 中创建了一些 4x4 像素、16 位灰度图像,并将它们保存为非压缩、无交错的 PNG 文件。我正在尝试编写一个程序来从这些文件中提取图像数据,但我对 IDAT block 有
我试图了解数据是如何存储到 IDAT block 中的。我正在编写一个小 PHP 类,我可以检索大部分块信息,但我从 IDAT 获得的信息与我的图像像素不匹配: 它是带 alpha(位深度 8)的 2
在下面的示例图片中,我有一个黄色边框仅用于显示目的。 实际的 .png 文件是一个简单的 3 像素 x 3 像素的黑白图像。我最初想尝试使用 2x2,但这无助于解释低/高与高/低绘图流。至少这样,我会
我正在研究有关文件上传高漏洞的 DVWA。我想绕过过滤器,它只允许上传 jpg 或 png 等图像。所以我打算嵌入有效载荷 我想完成 DVWA 的目标。它说 Execute any PHP func
这是这个问题的扩展 R xts and data.table . 我看到 as.xts.data.table 是 data.table 包的新增内容。 当我使用 IDate(整数日期)设置日期时,在
出于学习目的,我正在尝试编写自己的 PNG 解码器。我用来解压缩数据的代码如下: //Stores the return code from the inflation stream int retu
阅读 ?IDate 时,将我的字符变量转换为大型数据表中的整数日期似乎是个好主意。谁不想快速排序和分组? IDate 帮助清楚地提到该功能仍处于试验阶段,因此我的问题更多是反馈而不是提示。 为什么计算
我一直在使用 data.table 几乎所有我使用 data.frames 的东西,因为它在大内存数据(几百万行)上要快得多。但是,我不太确定如何在不使用 apply (非常慢)的情况下向 IDate
我有一个我编写的 C#/.NET 实用程序,可以从磁盘加载 PNG 图像 Bitmap b = Bitmap.FromStream(new MemoryStream(File.ReadAllBytes
我在应用程序中有一些 HTML 内容页面,我正在使用 UIWebView 来显示它们。其中一些页面中有一个 PNG 图像,它在 xcode 的调试控制台中生成以下消息: ImageIO: PNG in
在 Windows 机器上安装了 data.table 1.9.7 后,我有一个 data.table A,其中一列是 Date 类型。我想使用 fwrite 将 A 导出到 CSV 文件,但是当我运
有没有好的工具可以检查 PNG 文件是否存在我在这里遇到的问题?起初我担心我的学习应用程序(3 种分辨率)中的数千个“图 block ”存在问题,但似乎一个或多个特定的 png 文件存在内部问题。 最
我正在开发一个 ios 应用程序,我遇到了一个奇怪的问题。当我在模拟器或设备上运行它时,它运行良好。但是,当我将它上传到 TestFlight 并将其下载到设备时,它会在启动屏幕显示后立即崩溃。发生这
刚刚在我的 swift 项目调试器中遇到了这个看起来很有趣的错误。 可能某处的图像名称无效,但我不确定 iDOT 和 IDAT 之间的额外 block 是什么意思。 你知道是什么原因造成的吗? 最佳答
我正在编写一些代码,这些代码可以在没有 libpng 的情况下构建基于简单调色板的 PNG 文件。输出文件,在这个阶段只有 IHDR、PLTE、IDAT(x3) 和 IEND block 。唯一可能有
我是一名优秀的程序员,十分优秀!