libpng未读数据

时间:2011-04-20 02:59:32

标签: c libpng

似乎用libpng解码PNG文件时,它不读取最后16个字节,所以我向前寻找16个字节到达终点。我可以假设所有PNG文件都是如此吗?

#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);
}

File Size: 20279  
Ending File Position: 20263

2 个答案:

答案 0 :(得分:4)

在png_read_image之后你应该在技术上有一个png_read_end调用:

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

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

之后,职位应该匹配。

即使是libpng docs(第13.7节的最后一段),也似乎没必要。

答案 1 :(得分:1)

只有你对PNG以外的其他数据流感兴趣(kaykun是!)。但是,如果你只是想要到达PNG的末尾并且不关心剩余PNG块的内容,正如引用的书所说,你可以使用NULL而不是end_info(因此不需要创建end_info结构)。你不能指望PNG文件的其余部分正好是16个字节;如果PNG在最后一个IDAT块之后恰好包含文本块,那么会有更多。