2011-05-09 50 views
1

我試圖創建一個簡單的8位png編寫器,並且除了IDAT塊(重要的)之外,我已經準備好了所有正在編寫的塊。我相信我的問題在於壓縮。我試過使用GZipStreamDeflateStream類輸出壓縮數據無濟於事。他們似乎沒有輸出正確的格式。他們對此是錯誤的方法,還是應該正確工作?使用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輸出,並輕鬆地轉換它或什麼?

回答

0

原來的答案是,您不能使用其中任何一種,而需要使用zlib庫。