你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
做过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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
【利用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中的实现。
好了, 你再好好研究下
评分
查看全部评分