PNG 从 IDAT 块解码数据

问题描述 投票:0回答:1

我正在尝试用 C++ 制作一个 png 文件阅读器。我了解块结构,但我很难理解如何读取“IDAT”块中的数据以获得每个像素颜色。 这是我的数据

宽度:16 身高:16 位深度:1 颜色类型:3 压缩方式:0 过滤方式:0 隔行扫描方式:0

PLTE 数据:FF 00 00(十六进制) IDAT 数据:08 1D 63 20 11 00 00 00 30 00 01(十六进制)

我不知道如何解码数据,任何人都可以解释我,即使只是一个像素的例子,谢谢

c++ png decoder
1个回答
0
投票

首先,如果您的 PLTE 块只有三个字节,即一种颜色,那么您的图像只能包含一种颜色。每个像素都是红色的!每个像素的解码位必须全部为 0,因为即使有一个像素值为 1,那么由于调色板索引超出范围,PNG 解码器也必须报告错误。

其次,显示的IDAT数据必须是解压后的,因为没有zlib头。 16x16 深度 1 图像存储在 48 个字节中(一个滤波器字节加上每 16 像素行两个像素字节,乘以 16 行)。显示的 11 个字节远远不够。此外,未压缩 IDAT 数据的第一个字节是该扫描线的过滤器类型,它必须在 0..4 中。不可能是8。

底线:您问题中的数据无法解码,因为它不是有效的 PNG 数据。

© www.soinside.com 2019 - 2024. All rights reserved.