pngファイルの解凍に問題があります。これは、IDATチャンクを処理するコードである:inflateを使用してpngファイルを解凍する
At
は、PNGファイルのバッファ内の現在の位置であり、そして
PngImage
は画像の幅、高さ、及び深さを保持して有するだけ構造体である
case PNG_CHUNK_IDAT: {
z_stream Stream = {};
int Error = inflateInit(&Stream);
if(Error == Z_OK) {
Stream.avail_in = ChunkLength;
Stream.next_in = At;
Stream.avail_out = PngImage.Width * PngImage.Height * PngImage.Depth;
Stream.next_out = PngImage.Pixels;
do {
Error = inflate(&Stream, Z_NO_FLUSH);
if(Error != Z_OK) {
break;
}
} while(Stream.avail_out != 0);
inflateEnd(&Stream);
}
At += ChunkLength;
break;
}
サイズがwidth*height*depth
の符号なしchar配列。
私は解凍しようとしている画像はこれです:それは、フィルタリング(0)を持っていないとアルファとpngのトゥルーカラーであるarial.png
。 IDATチャンクも1つだけ含まれています。
しかし、その代わりに、私はこのような何かを得る:私は画像が逆さまであることを認識してんだincorrect png
を、それは私のレンダラというボトムアップとPNGはトップダウンであることの問題です。それは私が今懸念しているものではありません。
inflate
は実際には1回だけ実行され、Z_OKを返すことに注意する必要があります。そのため、スキャンラインフィルタを処理しないという問題はないと思います。私は行ごとに1バイト追加して、Pixels
配列に各行の最初のバイトをコピーしようとしなかったが、それは違いの多くをしませんでした。
私が間違っていると思われるアイデアはありますか?
不適切な画像は、私がレンダリングする画面のスクリーンショットで、640x480です。私はそれを言及すべきだった。しかし、この問題はフィルタリングバイトの後にあったので、ありがたいです。 –