我正在尝试创建一个简单的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();
}
从我读过的关于压缩方法 应该如何工作(here)的内容来看,输出的第一个字节的低位四位应该是{{1} }表示压缩模式= 8,但是使用上面的代码,我得到了1000
。实际上,基于更严格的测试,我没有看到一个双字节头是基于zlib格式的有效头,直到我的测试数据的gzip压缩版本的第1689个字节,我相当肯定不是实际上是标题。
那么,我是否需要为C#获取一个zlib库才能使其正常工作或是否有其他方法?比如,我可以从GZipStream获取输出并轻松转换它吗?
答案 0 :(得分:0)
原来答案是你不能使用其中任何一个,而你需要使用zlib库。