使用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图片相关推荐

  1. libpng库编码图片为png(RGB压缩为png图片:与ffmpeg视频解码存储为png图片)

    //*====== 参考:1.http://blog.csdn.net/solstice/article/details/2062 2.libpng库的example.c文件 ======*// 一. ...

  2. libpng库的使用讲解

    由于个人想学习DirectFB的使用.而 DirectFB依赖于libpng和libjpeg库,所以需要简单了解下libpng库的使用方法.本文转自:http://www.cnblogs.com/xi ...

  3. VC6 下 libpng 库的编译与初步使用以及压缩与解压缩

    VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 进 ...

  4. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  5. activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  6. libjpeg库和libpng库的移植和使用

    目录 1.libjpeg库移植 2.zlib库移植 3.libpng库移植 4.开源库的使用方法 1.libjpeg库移植 [1]下载源码与准备交叉工具链 libjpegv6下载地址 [2]解压源码并 ...

  7. 两台电脑串口传输文件及调用opencv库编程显示图片和文本

    文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...

  8. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库解码 WebP 图片 )

    文章目录 一.Android 中使用 libwebp.so 库解码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库解码 WebP 图片 libwe ...

  9. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )

    文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...

最新文章

  1. mysql用户的创建和授权_MySQL用户创建和授权
  2. python与MySQL交互
  3. 采用的php cms分校站点 打开特别慢,phpcms v9 打开网站特别慢 增加数据库缓存方法...
  4. 解决CSS移动端1px边框问题
  5. 【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...
  6. ios nslog 例子_iOS Block实例
  7. 关于安卓手机在微信浏览器中无法调起相机的原因
  8. [AHOI2004]实验基地 dp+枚举
  9. java流 视频_java如何对视频文件处理?包括拉流推流视频截取等?
  10. 不应被忽视的医院终端安全建设
  11. iOS中文字体斜体效果
  12. spring boot 动态代理
  13. 如何利用计算机截屏快捷键,电脑怎么截图 电脑选区域截图怎么截 电脑截图快捷键是什么...
  14. 分享一个我常用的信息差赚钱渠道
  15. 前端-优雅的VueJS
  16. OpenTracing语义标准
  17. 《神秘的程序员们》年度抽奖活动 开奖了
  18. viterbi,维特比算法通俗理解
  19. java拼音搜索排序算法_Java汉字按照拼音排序
  20. 微信小程序——简单计算器

热门文章

  1. java中super(aa bb cc)_面向对象程序设计(Java)答案
  2. oracle物化视图视频,Oracle物化视图使用详解视频教程
  3. linux系统cadence安装,第一次安装Linux双系统和cadence IC5033的过程
  4. C语言俄罗斯方块统计消行,求助 关于俄罗斯方块如何消行(附上消行部分代码)...
  5. PCAN-UDS API实现uds协议的BootLoader刷写流程
  6. Microsoft365与Office到底啥区别?如何选择下载安装哪个版本?
  7. 【编译原理】学习笔记以及课程设计
  8. 从零开始创建一个个人博客前端Vue,后端node.js(第一天)
  9. idea快捷键大全(常用的都有)
  10. 将对象mock填充数据 获取json格式对象,便于文档编辑