使用 C 使用 libpng 逐行写入图像
Write an image row by row with libpng using C
我正在尝试使用 C(linux 上的 gcc)使用 libpng 库创建 png 图像。
这应该暴露我的问题:
void createPng(char *filename, int width, int height) {
FILE *fp = fopen(filename, "wb");;
png_bytep row = NULL;
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr, width, height,
8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_text title_text;
title_text.compression = PNG_TEXT_COMPRESSION_NONE;
title_text.key = "Title";
title_text.text = "My title";
png_set_text(png_ptr, info_ptr, &title_text, 1);
png_write_info(png_ptr, info_ptr);
row = (png_bytep) malloc(sizeof(png_byte)*width*3); //I think the problems start here
for(int y=0; y<height; y++) {
for(int x=0; x<width; x++) {
row[x*3] = 0; //Red
row[x*3+1] = 0; //Green
row[x*3+2] = 0; //Blue
}
png_write_row(png_ptr, row); //I think this causes the segmentation fault
}
png_write_end(png_ptr, row);
}
在我看来,这个函数应该创建一个黑色图像,问题是执行因分段错误而停止。我认为发生这种情况是因为我没有将创建良好的 png_bytep
传递给 png_write_row
.
我知道不检查所有这些函数调用(在程序的第一部分)return 是否是有效指针(而不是 NULL
)不是一个好习惯。尽管如此,我还是选择了 post 没有检查的最小代码,但我已经确认问题不存在。
代码没问题,除了最后一行:
png_write_end(png_ptr, row);
这应该是...
png_write_end(png_ptr, info_ptr);
因为 png_write_end()
函数将 info_ptr
(无论是什么)作为第二个参数。
除此之外,代码工作正常。
感谢您提供一个很好的起点-逐行编写 PNG 图像的示例。
我正在尝试使用 C(linux 上的 gcc)使用 libpng 库创建 png 图像。 这应该暴露我的问题:
void createPng(char *filename, int width, int height) {
FILE *fp = fopen(filename, "wb");;
png_bytep row = NULL;
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr, width, height,
8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_text title_text;
title_text.compression = PNG_TEXT_COMPRESSION_NONE;
title_text.key = "Title";
title_text.text = "My title";
png_set_text(png_ptr, info_ptr, &title_text, 1);
png_write_info(png_ptr, info_ptr);
row = (png_bytep) malloc(sizeof(png_byte)*width*3); //I think the problems start here
for(int y=0; y<height; y++) {
for(int x=0; x<width; x++) {
row[x*3] = 0; //Red
row[x*3+1] = 0; //Green
row[x*3+2] = 0; //Blue
}
png_write_row(png_ptr, row); //I think this causes the segmentation fault
}
png_write_end(png_ptr, row);
}
在我看来,这个函数应该创建一个黑色图像,问题是执行因分段错误而停止。我认为发生这种情况是因为我没有将创建良好的 png_bytep
传递给 png_write_row
.
我知道不检查所有这些函数调用(在程序的第一部分)return 是否是有效指针(而不是 NULL
)不是一个好习惯。尽管如此,我还是选择了 post 没有检查的最小代码,但我已经确认问题不存在。
代码没问题,除了最后一行:
png_write_end(png_ptr, row);
这应该是...
png_write_end(png_ptr, info_ptr);
因为 png_write_end()
函数将 info_ptr
(无论是什么)作为第二个参数。
除此之外,代码工作正常。
感谢您提供一个很好的起点-逐行编写 PNG 图像的示例。