平台=Win10 x64编译器=愚者语言=C库=libpng16.dll
我尝试使用libpng库,但是printf在下面这行之后什么也不输出:
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
完整代码:
#include <stdio.h>
#include <png.h>
int main(int argc, char* argv[])
{
printf("starting...\n");
FILE *fp = fopen("test.png", "rb");
if (!fp) {
printf("error #%d\n", 1);
}
// Read the PNG header
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
printf("error #%d\n", 2);
}
// create stuct for png info/meta data
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
printf("error #%d\n", 3);
}
if (setjmp(png_jmpbuf(png_ptr))) {
printf("error #%d\n", 4);
}
png_init_io(png_ptr, fp);
// Read the PNG image data
printf("before printf dies\n");
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
printf("this will not print after png_read_png is ran\n");
fflush(stdout);
/* it won't print regardless if the below cleanup code is commented out or not */
// Get the image dimensions and bit depth
png_uint_32 width, height;
int bit_depth, color_type;
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
// Allocate memory for the image data
png_bytep *row_pointers = png_malloc(png_ptr, height * sizeof(png_bytep));
for (png_uint_32 i = 0; i < height; i++)
{
row_pointers[i] = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
}
// Read the image data into memory
png_read_image(png_ptr, row_pointers);
// Clean up
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
// Free the memory allocated for the image data
for (png_uint_32 i = 0; i < height; i++)
{
png_free(png_ptr, row_pointers[i]);
}
png_free(png_ptr, row_pointers);
/**/
fclose(fp);
return 0;
}
它将输出以下内容:
starting...
before printf dies
很抱歉有个新手问题。但是我找不到任何关于这个的信息。只有一堆帖子说要用换行符结束printf,但是我正在这样做。提前感谢你的帮助!
1条答案
按热度按时间kt06eoxx1#
为什么你的代码看起来像是被锁住了,没有进展,原因是你误解了setjmp()返回的内容。你似乎认为它返回0表示成功,而!0表示“错误”。
这是不正确的。当你实际调用setjmp()时,它返回0,当其他代码调用longjmp()并返回到那里时,它返回!0。
png_read_image()似乎(出于某种原因)调用jongjmp()来发出错误信号,所以你的代码进入了一个无限循环。
所有的错误测试都不应该只是记录错误然后继续运行程序,它们应该exit()或者return。
显然还有其他一些问题(为什么png_read_image()失败),但这就是当前问题(代码锁定)的原因。