使用libpng库读PNG图片
使用libpng库读PNG图片
void read_png_image(string path, unsigned char **data, int* s)//"icon1.png"
{FILE* fp;fp = fopen((char*)path.c_str(), "rb");if (!fp) {printf("no file\n");return;}png_structp png_ptr;png_infop info_ptr;int m_width, m_height;png_ptr = png_create_read_struct(png_get_libpng_ver(NULL), NULL, NULL, NULL);info_ptr = png_create_info_struct(png_ptr);if (info_ptr == NULL) {printf("info_ptr == NULL\n");png_destroy_read_struct(&png_ptr, &info_ptr, NULL);return;}setjmp(png_jmpbuf(png_ptr));//{// printf("setjmp == NULL\n");// png_destroy_read_struct(&png_ptr, &info_ptr, NULL);// return;//}#define PNG_BYTES_TO_CHECK 4char buf[PNG_BYTES_TO_CHECK];int temp = fread(buf, 1, PNG_BYTES_TO_CHECK, fp);if (temp < PNG_BYTES_TO_CHECK) {fclose(fp);printf("PNG_BYTES_TO_CHECK == NULL\n");png_destroy_read_struct(&png_ptr, &info_ptr, NULL);return;}temp = png_sig_cmp((png_bytep)buf, (png_size_t)0, PNG_BYTES_TO_CHECK);if (temp!=0) {fclose(fp);printf("no png == NULL\n");png_destroy_read_struct(&png_ptr, &info_ptr, NULL);return;}rewind(fp);png_init_io(png_ptr, fp);//png_set_sig_bytes(png_ptr, 8);//png_read_info(png_ptr, info_ptr);png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);// 得到文件的宽高色深if ((png_ptr != NULL) && (info_ptr != NULL)){m_width = png_get_image_width(png_ptr, info_ptr);m_height = png_get_image_height(png_ptr, info_ptr); //通过png库中的api获取图片的宽度和高度printf("%s, %d, m_width =%d, m_height = %d\n", __FUNCTION__, __LINE__, m_width, m_height);}int color_type = png_get_color_type(png_ptr, info_ptr); //通过api获取color_typeprintf("%s, %d, color_type = %d\n", __FUNCTION__, __LINE__, color_type);int size = m_height * m_width * 4;*s = size;unsigned char *rgba = NULL;rgba = (unsigned char *)malloc(size);*data = rgba;//printf("rgba=%x,data=%x;size=%d\n", rgba, data, size);if (NULL == rgba){printf("%s, %d, rgba == NULL\n", __FUNCTION__, __LINE__);return;}int pos = 0;// row_pointers里边就是传说中的rgb数据了png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);int i, j;for (i = 0; i < m_height; i++){for (j = 0; j < (4 * m_width); j += 4){rgba[pos++] = row_pointers[i][j]; // redrgba[pos++] = row_pointers[i][j + 1]; // greenrgba[pos++] = row_pointers[i][j + 2]; // bluergba[pos++] = row_pointers[i][j + 3]; // alpha}}//for (i = 0; i < 12; i++ )//{// printf("%s, %d, rgba[%d] = %d\n", __FUNCTION__, __LINE__, i, rgba[i]);//}png_destroy_read_struct(&png_ptr, &info_ptr, 0);fclose(fp);printf("over\n");}
调用该函数
unsigned char *data = NULL;
int s = 0;
read_png_image("icon1.png", &data, &s);
使用libpng库读PNG图片相关推荐
- libpng库编码图片为png(RGB压缩为png图片:与ffmpeg视频解码存储为png图片)
//*====== 参考:1.http://blog.csdn.net/solstice/article/details/2062 2.libpng库的example.c文件 ======*// 一. ...
- libpng库的使用讲解
由于个人想学习DirectFB的使用.而 DirectFB依赖于libpng和libjpeg库,所以需要简单了解下libpng库的使用方法.本文转自:http://www.cnblogs.com/xi ...
- VC6 下 libpng 库的编译与初步使用以及压缩与解压缩
VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 进 ...
- bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示
1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...
- activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- libjpeg库和libpng库的移植和使用
目录 1.libjpeg库移植 2.zlib库移植 3.libpng库移植 4.开源库的使用方法 1.libjpeg库移植 [1]下载源码与准备交叉工具链 libjpegv6下载地址 [2]解压源码并 ...
- 两台电脑串口传输文件及调用opencv库编程显示图片和文本
文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...
- 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库解码 WebP 图片 )
文章目录 一.Android 中使用 libwebp.so 库解码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库解码 WebP 图片 libwe ...
- 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )
文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...
最新文章
- mysql用户的创建和授权_MySQL用户创建和授权
- python与MySQL交互
- 采用的php cms分校站点 打开特别慢,phpcms v9 打开网站特别慢 增加数据库缓存方法...
- 解决CSS移动端1px边框问题
- 【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...
- ios nslog 例子_iOS Block实例
- 关于安卓手机在微信浏览器中无法调起相机的原因
- [AHOI2004]实验基地 dp+枚举
- java流 视频_java如何对视频文件处理?包括拉流推流视频截取等?
- 不应被忽视的医院终端安全建设
- iOS中文字体斜体效果
- spring boot 动态代理
- 如何利用计算机截屏快捷键,电脑怎么截图 电脑选区域截图怎么截 电脑截图快捷键是什么...
- 分享一个我常用的信息差赚钱渠道
- 前端-优雅的VueJS
- OpenTracing语义标准
- 《神秘的程序员们》年度抽奖活动 开奖了
- viterbi,维特比算法通俗理解
- java拼音搜索排序算法_Java汉字按照拼音排序
- 微信小程序——简单计算器
热门文章
- java中super(aa bb cc)_面向对象程序设计(Java)答案
- oracle物化视图视频,Oracle物化视图使用详解视频教程
- linux系统cadence安装,第一次安装Linux双系统和cadence IC5033的过程
- C语言俄罗斯方块统计消行,求助 关于俄罗斯方块如何消行(附上消行部分代码)...
- PCAN-UDS API实现uds协议的BootLoader刷写流程
- Microsoft365与Office到底啥区别?如何选择下载安装哪个版本?
- 【编译原理】学习笔记以及课程设计
- 从零开始创建一个个人博客前端Vue,后端node.js(第一天)
- idea快捷键大全(常用的都有)
- 将对象mock填充数据 获取json格式对象,便于文档编辑