PNG 이미지 파일의 IDAT 블록에서 데이터를 부풀려 보는데 문제가있었습니다. 지금까지 IHDR 블록을 읽고 정확한 데이터를 반환 할 수있었습니다. 그러나, 내가 파일의 원시 RGB 값을 얻으려고 압축을 풀려고했을 때, 나는 다른 것들로부터 0을 얻는 동안 오직 하나의 이미지에서만 성공할 수있었습니다. 이것은 zlib에서 팽창시키기 위해 사용한 코드입니다. 상기로부터 PNG의 팽창 데이터는 특정 이미지에서만 성공합니까?
unsigned char temp[4];
fread(&temp,1,4,pf);
unsigned int ihdr_size = convert_endian(temp);
unsigned char blk[ihdr_size + 8];
fread(blk,1,ihdr_size + 8,pf);
if (check_ihdr(blk) == -1){
fclose(pf);
return -1;
}
this->width = convert_endian(blk+4);
this->height = convert_endian(blk+8);
long area = this->width*this->height*3 +this->height+1;
printf("%ld x %ld\n",this->width, this->height);
printf("Bit depth: %1x\n", (unsigned char)blk[12]);
printf("Color type: %1x\n", (unsigned char)blk[13]);
while(fread(&temp,1,4,pf) > 0){
unsigned int bsize = convert_endian(temp);
unsigned char chunk[bsize+8] = {0};
fread(chunk,1, bsize+8,pf); //8 extra for block name and CRC
if (chunk_type(chunk)== 1){ //IDAT
this->picture = new unsigned char[area];
z_stream infstream;
infstream.zalloc = Z_NULL;
infstream.zfree = Z_NULL;
infstream.opaque = Z_NULL;
infstream.avail_in = bsize; // size of input
infstream.next_in = chunk+4; // input char array (without chunk name)
infstream.avail_out = area; // size of output
infstream.next_out = this->picture; // output char array
inflateInit(&infstream);
if (int er = inflate(&infstream, Z_NO_FLUSH) != Z_STREAM_END){
printf("Error!\n");
}
inflateEnd(&infstream);
printf("OUT:%d %ld\n", infstream.avail_out, area);
for (long i = 0; i < 1000; i+=4){
printf("%x %x %x\n",this->picture[i], this->picture[i+1], this->picture[i+2]);
}
}
printf("B:%x\n",bsize);
printf("%c%c%c%c\n",chunk[0], chunk[1], chunk[2], chunk[3]);
}
, 나는이 이미지
image2 와 시도 (같은 이미지 만 잘립니다) 때,
image#1 그러나이 이미지에 RGB 값을 얻는 데 성공했다, 프로그램은 단지를 반환 할 수 있었다 RGB 데이터의 처음 3 바이트 (나머지는 0 임). 이 코드로 잘못 구현 한 것이 있습니까?