Написание фрагмента IDAT png с использованием C # - PullRequest
1 голос
/ 09 мая 2011

Я пытаюсь создать простой 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 и преобразовать его легко или что-то в этом роде?

1 Ответ

0 голосов
/ 11 мая 2011

Оказывается, ответ заключается в том, что вы не можете использовать ни один из них, и вам нужно использовать библиотеку zlib.

...