libpng непрочитанные данные - PullRequest
0 голосов
/ 20 апреля 2011

Кажется, что при декодировании файлов PNG с помощью libpng он не читает последние 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 ]

4 голосов
/ 20 апреля 2011

После 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 голос
/ 21 апреля 2011

Это необходимо, только если вас интересует остальная часть потока данных за пределами PNG (что такое kaykun!).Однако, если вы просто хотите дойти до конца PNG и не заботитесь о содержимом оставшихся фрагментов PNG, как говорится в упомянутой книге, вы можете использовать NULL вместо end_info (и, следовательно, не нужно создаватьструктура end_info).Вы не можете рассчитывать на то, что оставшаяся часть PNG-файла будет точно 16 байтами;будет больше, если PNG будет содержать фрагменты текста после последнего фрагмента IDAT.

...