gpt4 book ai didi

libpng - 使用 libpng 提高性能

转载 作者:行者123 更新时间:2023-12-01 14:24:38 56 4
gpt4 key购买 nike

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

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

  • 我可以在将 PNG 文件传输到微 Controller 之前对其进行操作。
  • 数据实际上是在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);

    应该考虑哪些参数以获得最快的解压?

    最佳答案

    这取决于图像的性质。

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

    方法 12 也恰好是一个非常快的压缩器,但据我所知,这与您无关。 zlib 策略 2 是 Huffman-only 压缩,因此任何非零 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);

    关于libpng - 使用 libpng 提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22167397/

    56 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com