为什么使用libpng库的C代码可以正确读取PNG信息,但是当调用png_read_row时却崩溃了?

2vuwiymt  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(114)
FILE * fp = fopen(Usr.Source, "rb");
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
GraphicHeight = png_get_image_height(png_ptr, info_ptr); // Returns correct value
GraphicWidth = png_get_image_width(png_ptr, info_ptr); // Returns correct value
png_uint_32 rowBytes = png_get_rowbytes(png_ptr, info_ptr); // Returns expected value
png_bytep pngImg = (png_bytep) malloc(GraphicHeight * rowBytes); // Allocates fine
png_bytepp row_pointers = (png_bytepp) malloc(GraphicHeight * sizeof(png_bytep)); 

for (int rw = 0; rw < GraphicHeight; rw++) {
  row_pointers[rw] = pngImg + rw * rowBytes; 
  png_read_row(png_ptr, row_pointers[rw], NULL); // Crashes on row 0
}

字符串
我试过png_read_rows()和png_read_image()。它们都调用png_read_row()和crash。当crash发生时,跟踪看起来像,

#9  0x00007ffff7f96ada in ?? () from /lib/x86_64-linux-gnu/libpng16.so.16
#10 0x00007ffff7f88dbf in png_read_row () from /lib/x86_64-linux-gnu/libpng16.so.16


我检查的所有示例代码和文档都说它应该可以工作。那么为什么它会崩溃呢?

eivgtgni

eivgtgni1#

您一定没有仔细阅读示例代码和文档。png_read_png()读取整个PNG图像,因此没有剩下任何行。您希望使用png_read_info(),只读取信息块。
您还需要使用png_read_end()png_destroy_read_struct()来完成阅读并在最后进行清理。

相关问题