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輸出,並輕鬆地轉換它或什麼?