如题,小弟最近在做图片显示相关的项目,其中有使用Libpng解码PNG图片。
我使用STM32的MCU,不知道怎么不能使用默认的”
png_init_io(png_ptr, fp)“这个数据流函数初始化,
只能自己编写数据流函数,用这个函数 "png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn);" 添加进去 。
但是没写过,有大佬指点下怎么写的么
对于文件流数据数据设置代码如下:
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
=================
libpng提供了自定义转换函数的功能,可以让用户注册转换回调函数给libpng库,在libpng对输出数据进行转换的时候,先对png_set_xxxxx函数设置的参数进行转换,最后将会调用用户自定义的转换函数进行转换。
1: png_set_read_user_transform_fn(png_ptr,
2: read_transform_fn);
read_transform_fn为用户自定义的数据转换函数。具体实现可以参考pngtest.c中的实现。
好了, 你再好好研究下