当用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
最佳答案
在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节的最后一段)也使其显得不必要。
关于c - libpng未读数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5725052/