1
我试图创建一个简单的8位png编写器,并且除了IDAT块(重要的)之外,我已经准备好了所有正在编写的块。我相信我的问题在于压缩。我试过使用GZipStream
和DeflateStream
类输出压缩数据无济于事。他们似乎没有输出正确的格式。他们对此是错误的方法,还是应该正确工作?使用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输出,并轻松地转换它或什么?