png 파일의 압축을 푸는 데 문제가 있습니다. 이것은 IDAT 청크 처리하는 코드이다 At
은 PNG 파일 버퍼의 현재 위치 인inflate를 사용하여 png 파일 압축 해제
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;
}
, 그리고 PngImage
이미지의 폭, 높이 및 깊이를 보유하고 있습니다 막 구조체이며 크기가 width*height*depth
인 부호없는 char 배열
전 압축을 시도하고,이 이미지이다 arial.png
그것은 (0)에는 필터링이 없으며 알파 PNG로 트루이다. 또한 하나의 IDAT 덩어리 만 포함합니다.
는하지만 그 대신 나는 이런 식으로 뭔가 얻을 : incorrect png
나는 이미지가 거꾸로 것으로 알고 있어요, 그건 내 렌더러는 하향식 (top-down)되는 상향식 (bottom-up) 및 PNG 인에 문제가이다를; 내가 지금 염려하고있는 게 아니야.
실제로는 inflate
이 실제로 한 번만 실행되어 Z_OK를 반환하므로 스캔 라인 필터를 처리하지 않는 문제는 아닌 것으로보아야합니다. 행 당 1 바이트를 추가 한 다음 각 행의 첫 번째 바이트를 Pixels
배열로 복사하지 않았지만 그 차이가별로 없었습니다.
내가 잘못 생각한 아이디어가 있습니까?
잘못된 이미지는 내가 렌더링 할 화면의 스크린 샷으로 640x480입니다. 나는 그것을 언급 했어야했다. 그러나 문제는 필터링 바이트로 인한 것이므로 감사합니다. –