【问题标题】:Write an image row by row with libpng using C使用 C 使用 libpng 逐行写入图像
【发布时间】:2018-07-23 06:00:13
【问题描述】:

我正在尝试使用 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

我知道不检查所有这些函数调用(在程序的第一部分中)是否返回有效指针(而不是NULL)不是一个好习惯。尽管如此,我还是选择发布一个没有检查的最小代码,但我已经验证问题不存在。

【问题讨论】:

  • 您是否尝试获取段错误的回溯?
  • 在任何情况下你不能忽略的一个返回值是setjmp()。它在第一次调用时返回 0,当被 longjmp() 调用时返回非零,libpng 使用它来处理一些错误。您必须在其他调用之前测试非零并返回错误,否则您将陷入无限循环。

标签: c dynamic-allocation libpng


【解决方案1】:

代码没问题,除了最后一行:

png_write_end(png_ptr, row);

这应该是……

png_write_end(png_ptr, info_ptr);

因为png_write_end() 函数将info_ptr(无论是什么)作为第二个参数。

除此之外,代码运行良好。

感谢您提供了逐行编写 PNG 图像的良好起点示例。

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多