你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
搬砖工 提问时间:2018-8-27 11:03 /
如题,小弟最近在做图片显示相关的项目,其中有使用Libpng解码PNG图片。
        我使用STM32的MCU,不知道怎么不能使用默认的”png_init_io(png_ptr, fp)“这个数据流函数初始化,
只能自己编写数据流函数,用这个函数  "png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn);" 添加进去 。
但是没写过,有大佬指点下怎么写的么
收藏 评论1 发布时间:2018-8-27 11:03

举报

1个回答
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蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版