.net 2.0 - 使用 C# 编写 IDAT png 块
本文关键字:编写 IDAT png 使用 net | 更新日期: 2023-09-27 17:55:52
我正在尝试创建一个简单的 8 位 png 编写器,并且除了 IDAT 块(重要的块)之外,我已经正确编写了所有块。 我相信我的问题出在压缩上。 我尝试使用 GZipStream
和 DeflateStream
类输出压缩数据,但无济于事。 它们似乎没有输出正确的格式。 它们是错误的方法,还是应该正常工作?
以下是对我现在使用的数据进行编码的方法:
private byte[] ImageData(Bitmap image, Dictionary<Color, byte> palette) {
int maxY = image.Height;
int maxX = image.Width;
byte[] data = new byte[(maxX + 1) * maxY];
int idx = 0;
for (int y = 0; y < maxY; ++y) {
data[idx++] = 0; //Filter type 0
for (int x = 0; x < maxX; ++x) {
Color c = image.GetPixel(x, y);
data[idx++] = palette[c];
}
}
MemoryStream stream = new MemoryStream();
GZipStream compressor = new GZipStream(stream, CompressionMode.Compress);
compressor.Write(data, 0, data.Length);
compressor.Flush();
stream.Flush();
return stream.ToArray();
}
从我读到的关于压缩方法应该如何工作的内容(这里),输出的第一个字节的低阶四位应该1000
表示压缩模式 = 8,但使用上面的代码,我得到了1110
。 事实上,基于更严格的测试,直到我的测试数据的 gzip 版本的第 1689 个字节,我才看到一个基于 zlib 格式的有效标头的两字节标头,我相当确定这实际上不是标头。
那么,我是否需要为 C# 获取一个 zlib 库才能使其正常工作,还是有其他方法? 比如,我可以从 GZipStream 获取输出并轻松转换它或其他东西吗?
事实证明,答案是你不能使用其中任何一个,你需要使用 zlib 库来代替。