.net 2.0 - 使用 C# 编写 IDAT png 块

本文关键字:编写 IDAT png 使用 net | 更新日期: 2023-09-27 17:55:52

我正在尝试创建一个简单的 8 位 png 编写器,并且除了 IDAT 块(重要的块)之外,我已经正确编写了所有块。 我相信我的问题出在压缩上。 我尝试使用 GZipStreamDeflateStream 类输出压缩数据,但无济于事。 它们似乎没有输出正确的格式。 它们是错误的方法,还是应该正常工作?

以下是对我现在使用的数据进行编码的方法:

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 获取输出并轻松转换它或其他东西吗?

.net 2.0 - 使用 C# 编写 IDAT png 块

事实证明,答案是你不能使用其中任何一个,你需要使用 zlib 库来代替。