我想要读取一个PNG文件,修改像素值并使用libpng库存储更新后的PNG文件。
我编写了两个函数:read_png
和write_png
,按照官方libpng手册的指导进行编写。这个示例代码并没有修改像素值,因为它是一个最小可重现示例。同时,它也没有检查输入的文件是否确实是PNG格式的。
#include <png.h>
png_infop info_ptr;
png_bytepp row_pointers;
void read_png(char *file_name)
{
FILE *fp = fopen(file_name, "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);
row_pointers = png_get_rows(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
}
void write_png(char *file_name)
{
FILE *fp = fopen(file_name, "wb");
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_init_io(png_ptr, fp);
png_set_rows(png_ptr, info_ptr, row_pointers);
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
}
int main(int argc, char *argv[])
{
read_png(argv[1]);
write_png(argv[2]);
return 0;
}
代码编译时没有出现任何错误。
$ gcc -o rw_png -lpng rw_png.c
该程序可以使用两个参数运行。
$ ./rw_png input.png output.png
问题在于,尽管
output.png
被创建了,但它是一个空文件,而不是一个 PNG 文件。$ file output.png
output.png: empty