2011-04-20 4 views
0

libpng로 PNG 파일을 해독하면 마지막 16 바이트가 읽히지 않으므로 16 바이트를 앞으로 가져 와서 검색합니다. 이것이 모든 PNG 파일에 해당한다고 가정 할 수 있습니까?libpng 읽지 않은 데이터

#include<sys/stat.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<png.h> 
int fd; 
void png_read(png_struct *png,png_byte *data,png_size_t len){ 
    read(fd,data,len); 
} 
int main(void){ 
    fd=open("foo.png",O_RDONLY); 
    png_struct *png=png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); 
    png_info *png_info=png_create_info_struct(png); 
    png_set_read_fn(png,0,png_read); 
    struct stat s; 
    fstat(fd,&s); 
    printf("File Size: %d\n",s.st_size); 
    png_read_info(png,png_info); 
    int x=png_get_image_width(png,png_info); 
    int y=png_get_image_height(png,png_info); 
    int c=png_get_channels(png,png_info); 
    char *buf=malloc(x*y*c); 
    char **row=malloc(sizeof(*row)*y); 
    { 
    int i=0; 
    while(i<y){ 
     row[i]=buf+x*i*c; 
     i++; 
    } 
    } 
    png_read_image(png,(png_byte**)row); 
    printf("Ending File Position: %d\n",lseek(fd,0,SEEK_CUR)); 
    return(0); 
} 

. 위치가 일치해야 그 후

// ... 
png_read_image(png,(png_byte**)row); 

png_infop end_info = png_create_info_struct(png); 
png_read_end(png, end_info); 

:

File Size: 20279 
Ending File Position: 20263 

답변

4

는 png_read_image 후에는 기술적으로 png_read_end 호출이 있어야합니다.

libpng docs (13.7 절의 마지막 단락)조차도 불필요한 것처럼 보입니다.

1

PNG 이외의 나머지 데이터 스트림에 관심이있는 경우에만 필요합니다 (kaykun이 (가)!). 그러나 참조 된 책에서 말한 것처럼 PNG의 끝에 도달하여 나머지 PNG 청크의 내용에 신경 쓰지 않는다면 end_info 대신 NULL을 사용할 수 있습니다. 따라서 생성 할 필요가 없습니다 end_info 구조체). 정확히 16 바이트 인 PNG 파일의 나머지는 믿을 수 없습니다. PNG가 마지막 IDAT 덩어리 다음에 텍스트 덩어리를 포함한다면 더 많은 일이있을 것입니다.

관련 문제