0

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
4

2 に答える 2

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ドキュメント(セクション13.7の最後の段落)でさえ、不要に見えるようになっています。

于 2011-04-20T03:26:13.533 に答える
1

PNG以外の残りのデータストリームに関心がある場合にのみ必要です(これはkaykunです!)。ただし、参照されている本にあるように、PNGの最後に到達したいだけで、残りのPNGチャンクの内容を気にしない場合は、end_infoの代わりにNULLを使用できます(したがって、作成する必要はありません)。 end_info構造)。PNGファイルの残りの部分が正確に16バイトであることを期待することはできません。PNGに最後のIDATチャンクの後にテキストチャンクが含まれている場合はさらに多くなります。

于 2011-04-20T22:16:01.450 に答える