Я пытаюсь создать простой 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();
}
Из того, что я читал о том, как метод сжатия должен работать ( здесь ), младшие четыре бита первого байта вывода должны быть 1000
чтобы обозначить режим сжатия = 8, но с кодом выше, я получаю 1110
вместо. Фактически, основываясь на более строгом тестировании, я не вижу двухбайтовый заголовок, который является допустимым заголовком на основе формата zlib, до 1689-го байта gzipped версии моих тестовых данных, что, я уверен, не собственно заголовок.
Итак, мне нужно будет получить библиотеку zlib для C #, чтобы это работало правильно, или есть другой способ? Например, могу ли я взять вывод из GZipStream и преобразовать его легко или что-то в этом роде?