使用C#编写IDAT png块

时间:2011-05-09 14:56:27

标签: c# .net-2.0 png gzip

我正在尝试创建一个简单的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();
}

从我读过的关于压缩方法 应该如何工作(here)的内容来看,输出的第一个字节的低位四位应该是{{1} }表示压缩模式= 8,但是使用上面的代码,我得到了1000。实际上,基于更严格的测试,我没有看到一个双字节头是基于zlib格式的有效头,直到我的测试数据的gzip压缩版本的第1689个字节,我相当肯定不是实际上是标题。

那么,我是否需要为C#获取一个zlib库才能使其正常工作或是否有其他方法?比如,我可以从GZipStream获取输出并轻松转换它吗?

1 个答案:

答案 0 :(得分:0)

原来答案是你不能使用其中任何一个,而你需要使用zlib库。

相关问题