你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
做过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);" 添加进去 。
但是没写过,有大佬指点下怎么写的么
赞
0
收藏
0
评论
1
分享
发布时间:2018-8-27 11:03
举报
请先
登录
后回复
1个回答
feixiang20
回答时间:2018-8-28 00:37:53
a0a.1 32b0c
和你以前的帖子一样,看看资料参考:【图像解码之二——使用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
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
【利用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中的实现。
好了, 你再好好研究下
评分
查看全部评分