使用libpng提高性能

时间:2014-03-04 09:11:37

标签: libpng

我有一个带LCD显示屏的微控制器。我需要显示几个PNG图像。由于微控制器的性能有限,显示图像的时间太长。

我做了基准测试,检测到libpng花费的时间最多,而不是访问显示内存或(压缩)文件所在的存储空间。

  • 我可以在将PNG文件传输到微控制器之前对其进行操作。
  • 实际上,在使用png_set_read_fn注册的回调函数中读取数据。

编辑: 图像以每种颜色8位加上透明度编码,得到每像素32位。但大多数图片都是灰色的。

以下是我用来转换的函数序列:

png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, show_png_error, show_png_warn);
info_ptr = png_create_info_struct(png_ptr);
end_info = png_create_info_struct(png_ptr);
png_set_user_limits(png_ptr, MAX_X, MAX_Y);
png_set_read_fn(png_ptr, 0, &read_callback);
png_set_sig_bytes(png_ptr, 0);
png_read_info(png_ptr, info_ptr);
png_read_update_info(png_ptr, info_ptr);
result->image = malloc(required_size);
height = png_get_image_height(png_ptr, info_ptr);
png_bytep *row_pointers = malloc(sizeof(void*) * height);

for (i = 0; i < height; ++i)
    row_pointers[i] = result->image + (i * png_get_rowbytes(png_ptr, info_ptr));

png_set_invert_alpha(png_ptr);
png_read_image(png_ptr, row_pointers);
png_read_end(png_ptr, end_info);
free(row_pointers);
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);

应该考虑哪些参数才能获得最快的减压效果?

1 个答案:

答案 0 :(得分:2)

这取决于图像的性质。

对于照片,pngcrush方法12(过滤器类型1,zlib策略2,zlib级别2)运行良好。对于256或更少颜色的图像,方法7(过滤器类型0,zlib级别9,zlib策略0)运行良好。

方法12也恰好是一个非常快速的压缩器,但据我所知,这对你来说无关紧要。 zlib策略2是仅支持Huffman的压缩,因此任何非零zlib压缩级别的结果都是相同的。

在您的代码中,要获得与pngcrush方法7相同的行为,请使用

 png_set_compression_level(png_ptr, 9);
 png_set_compression_strategy(png_ptr, 0);
 png_set_filter(png_ptr,PNG_FILTER_NONE);

并获得pngcrush方法12的行为,

 png_set_compression_level(png_ptr, 2);
 png_set_compression_strategy(png_ptr, 2);
 png_set_filter(png_ptr,PNG_FILTER_SUB);