细品黑夜 发表于 2018-8-27 11:03:43

做过Libpng解码PNG图片的大佬指点下怎么写自数据流函数

如题,小弟最近在做图片显示相关的项目,其中有使用Libpng解码PNG图片。
      我使用STM32的MCU,不知道怎么不能使用默认的”png_init_io(png_ptr, fp)“这个数据流函数初始化,
只能自己编写数据流函数,用这个函数"png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn);" 添加进去 。
但是没写过,有大佬指点下怎么写的么

feixiang20 发表于 2018-8-28 00:37:53

和你以前的帖子一样,看看资料参考:【图像解码之二——使用libpng解码png图片】
【利用libpng中的函数读写png文件】
以下代码给你参考语法
================
第一个
对于文件流数据数据设置代码如下:
   1: /* One of the following I/O initialization methods is REQUIRED */
   2: def streams /* PNG file I/O method 1 */
   3: /* Set up the input control if you are using standard C streams */
   4: png_init_io(png_ptr, fp);
    用户自定义回调函数设置libpng数据源的代码如下:
   1: /* If you are using replacement read functions, instead of calling
   2:* png_init_io() here you would call:
   3:*/
   4: png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn);
libpng提供了默认的文件输入流的支持,并且提供了用户自定义回调函数来完成png数据的输入。
=====
/* 设置输出控制,如果你使用的是 C 的标准 I/O 流 */
   png_init_io(png_ptr, fp);
    /* 这是一种复杂的做法 */
    /* (必需)在这里设置图像的信息,宽度、高度的上限是 2^31。
    * bit_depth 取值必需是 1、2、4、8 或者 16, 但是可用的值也依赖于 color_type。
    * color_type 可选值有: PNG_COLOR_TYPE_GRAY、PNG_COLOR_TYPE_GRAY_ALPHA、
    * PNG_COLOR_TYPE_PALETTE、PNG_COLOR_TYPE_RGB、PNG_COLOR_TYPE_RGB_ALPHA。
    * interlace 可以是 PNG_INTERLACE_NONE 或 PNG_INTERLACE_ADAM7,
    * 而 compression_type 和 filter_type 目前必需是 PNG_COMPRESSION_TYPE_BASE
    * 和 and PNG_FILTER_TYPE_BASE。
    */
   png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_???,

=====
/* 复位文件指针 */
      rewind( fp );
      /* 开始读文件 */
      png_init_io( png_ptr, fp );
      /* 读取PNG图片信息和像素数据 */
      png_read_png( png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0 );
      /* 获取图像的色彩类型 */
      color_type = png_get_color_type( png_ptr, info_ptr );
      /* 获取图像的宽高 */
      w = png_get_image_width( png_ptr, info_ptr );
      h = png_get_image_height( png_ptr, info_ptr );
      /* 获取图像的所有行像素数据,row_pointers里边就是rgba数据 */
      row_pointers = png_get_rows( png_ptr, info_ptr );
   =====
    #ifdef streams /* I/O 初始化方法 1 */
   /* 设置输出控制,如果你使用的是 C 的标准 I/O 流 */
   png_init_io(png_ptr, fp);

#else no_streams /* I/O 初始化方法 2 */
   /* 如果你是要替换写入函数,而不想调用 png_init_io(),那么需要指定三个参数:
    * I/O相关的指针,假设为 user_io_ptr
    * 自定义的写入函数,假设为 user_write_fn
    * 自定义的I/O刷新函数,假设为 user_IO_flush_function

=================
第2个
libpng提供了自定义转换函数的功能,可以让用户注册转换回调函数给libpng库,在libpng对输出数据进行转换的时候,先对png_set_xxxxx函数设置的参数进行转换,最后将会调用用户自定义的转换函数进行转换。
   1: png_set_read_user_transform_fn(png_ptr,
   2:   read_transform_fn);
    read_transform_fn为用户自定义的数据转换函数。具体实现可以参考pngtest.c中的实现。


好了, 你再好好研究下
页: [1]
查看完整版本: 做过Libpng解码PNG图片的大佬指点下怎么写自数据流函数