2011-05-09 30 views
1

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

这里的方法来编码,我现在使用的数据:

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),是低阶的四输出的第一个字节的位应该是1000来表示压缩模式= 8,但是使用上面的代码,我会得到1110。实际上,基于更严格的测试,我没有看到基于zlib格式的有效头的两字节头,直到测试数据的gzip版本的第1689个字节为止,我相当肯定它不是实际上是头部。

所以,我需要得到一个C#的zlib库,使其工作正常或有另一种方式?喜欢,我可以从GZipStream输出,并轻松地转换它或什么?

回答

0

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