png格式解码库移植过程详解

2023-11-18

1、zlib库和png库的源码获取

(1)zlib库源码下载网址:http://www.zlib.net/;
(2)libpng库源码下载网址:ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/;
(3)如果想直接要源码,可以私信我,源码和下面的移植过程是对应的;

2、libpng库的移植步骤

(1)首先要编译zlib库,因为libpng库是依赖zlib库;
(2)将编译得到的zlib库和头文件存放路径导出到环境变量,这样在编译libpng库时可以直接使用;
(3)编译libpng库,得到动态库和头文件,并移植到自己的工程环境中;
(4)根据libpng库源码中的example.c示例代码,编写png图片的编解码函数;

3、zlib库的编译

解压源码:
	tar -zxvf zlib-1.2.8.tar.gz

导出交叉编译工具链:
	export CC=arm-linux-gcc

配置源码,生成Makefile:
	./configure -shared --prefix=/opt/pngDecode

	-shared:生成动态库
	--prefix:安装路径

编译和安装:
	make && make install

(1)解压源码:tar -zxvf zlib-1.2.8.tar.gz;
(2)导出交叉编译工具链:export CC=arm-linux-gcc;
(3)配置zlib库:./configure -shared --prefix=/opt/pngDecode;
(4)经过第三步会得到Makefile文件,执行命令:make && make install;
(5)在/opt/pngDecode目录下会生成include和lib文件夹,里面是zlib库的头文件和动态库;

4、libpng库源码编译

解压源码:
	tar -zxvf libpng-1.6.6.tar.gz

第一步:
	export LDFLAGS="-L/opt/pngDecode/lib"
	export CFLAGS="-I/opt/pngDecode/include"
	export CPPFLAGS="-I/opt/pngDecode/include"

第二步:
	./configure --host=arm-linux --enable-shared --enable-static --prefix=/opt/jpgDecode
	
	--host:指定目标平台
	--enable-shared:生成动态库
	--enable-static:生成静态库
	--prefix:指定安装目录,将来产物就存放在此路径

第三步:
	make && make install

(1)首先将zlib库的头文件和动态库路径导出到环境变量中,供libpng库的编译使用;
(2)调用configure文件配置libpng源码,生成Makefile文件;
(3)调用Makefile文件编译源码和安装zlib库;

5、png解码库的移植

(1)将编译得到的include目录下的头文件,和lib目录下动态库添加到你的代码工程中,并且动态库还需要部署到可执行程序的运行环境中;
(2)参考libpng源码中的example.c示例代码,编写调用png解码库去编解码png图片的函数;
(3)在实际编写png解码函数后会发现,还需要pngstruct.h和pnginfo.h,都在libpng库的源码中,拷贝过去即可;

6、png解码库的使用示例

// 结构体用来封装一个图片的各种信息
typedef struct pic_info
{
	char *pathname;			// 图片在文件系统中的路径名+文件名
	unsigned int width;		// 图片分辨率之宽
	unsigned int height;	// 图片分辨率之高
	unsigned int bpp;		// 图片bpp
	char *pData;			// 指向图片有效数据存储的buf数据
}pic_info;

// 函数功能: 判断一个图片文件是不是png图片
// 函数参数: path是图片文件的pathname
// 返回值:   如果是png则返回0,不是则非0
int is_png(const char *path)
{
	FILE *fp = NULL;
	char buf[PNG_BYTES_TO_CHECK] = {0};	

	/* Open the prospective PNG file. */   
	if ((fp = fopen(path, "rb")) == NULL)		
		return -1;	

	/* Read in some of the signature bytes */	
	if (fread(buf, 1, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK)	   
		return -1; 

//	printf("%d %d %d %d\n", buf[0], buf[1], buf[2], buf[3]);
	/* Compare the first PNG_BYTES_TO_CHECK bytes of the signature.		
	Return nonzero (true) if they match */	 
	return(png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK));
}

/*
 * 函数功能: 解码png图片,并将解码出来的RGB数据存储
 * 函数参数: pPic,记录源png图片,解码出来的图片宽高、图片数据缓冲区等信息
 * 返回值  : 成功解码则返回0,失败则返回-1
 */
 
int png_analyze(struct pic_info *pPic)
{
	FILE *fp = NULL;
	png_structp png_ptr;   
	png_infop info_ptr;
	int color_type;
	png_bytep* row_pointers;
	unsigned long len = 0;
	int pos = 0;
	int i = 0, j = 0;

	if ((fp = fopen(pPic->pathname, "rb")) == NULL) 
	{	 
		fprintf(stderr, "can't open %s\n", pPic->pathname);    
		return -1;	
	}

	// 第1步: 相关数据结构实例化
	png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
	if (png_ptr == 0)
	{
		fclose(fp);
		return -1;
	}

	info_ptr = png_create_info_struct(png_ptr);
  	if (info_ptr == 0)
  	{
   		png_destroy_read_struct(&png_ptr, 0, 0);
   		fclose(fp);
   		return -1;
  	}

	// 第2步: 设置错误处理函数
	if (setjmp(png_jmpbuf(png_ptr)))
	{
		png_destroy_read_struct(&png_ptr, &info_ptr, 0);
		fclose(fp);
		return -1;
	}

	// 第3步: 将要解码的png图片的文件指针和png解码器绑定起来
	png_init_io(png_ptr, fp);

	// 第4步: 读取png图片信息
	png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, 0);

	// 第5步: 相关图片信息打印出来看一看
	color_type = info_ptr->color_type;
	debug("color_type = %d\n", color_type);

	pPic->width = info_ptr->width;
	pPic->height = info_ptr->height;
	pPic->bpp = info_ptr->pixel_depth;
	len = info_ptr->width * info_ptr->height * info_ptr->pixel_depth / 8;
	debug("width = %u, height = %u, bpp = %u\n", pPic->width, pPic->height, pPic->bpp);

	// 第6步: 读取真正的图像信息
	row_pointers = png_get_rows(png_ptr,info_ptr);

	// 只处理RGB24位真彩色图片,其他格式的图片不管
	// 第7步: 图像数据移动到我们自己的buf中
	if(color_type == PNG_COLOR_TYPE_RGB)
  	{
   		//memcpy(pPic->pData, row_pointers, len);
		for(i=0; i<pPic->height; i++)
		{
			for(j=0; j<3*pPic->width; j+=3)
			{
				pPic->pData[pos++] = row_pointers[i][j+0];		
				pPic->pData[pos++] = row_pointers[i][j+1];		
				pPic->pData[pos++] = row_pointers[i][j+2];		
			}
		}
  	}

	// 第8步: 收尾处理
	png_destroy_read_struct(&png_ptr, &info_ptr, 0);
	// close file
	fclose(fp);
	
	return 0;
}

7、参考资源

《朱友鹏——嵌入式核心课程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

png格式解码库移植过程详解 的相关文章

  • 添加和检索一些元数据到 png 图像

    I need to add some metadata to a lot of images For example I need to add the position of the right eye and left eye to t
  • 使用 JavaScript 创建 Base64 编码图像

    由于图像是数据 我们可以将代码编写为 img src alt Red dot 现在我的观点是 我们可以使用 javascript 创建 base64 数据吗 有什么框架吗 我的实际要求是我有一个像 Cow 这样的字符串 我希望它作为图像 注
  • Fabric.JS 与 Node.JS - 导出为 PNG/JPEG

    所以我只是在玩 Fabric JS适用于 Node JS 不适用于 Web 我已经成功制作了一个静态画布 并在上面放置了一个矩形 出口的时间到了 这是我创建画布并添加矩形的代码 var canvas new fabric StaticCan
  • 使用 C++、libpng 和 OpenMP 并行化 PNG 文件创建

    我目前正在尝试在 C 中实现一个基于 libpng 的 PNG 编码器 它使用 OpenMP 来加速压缩过程 该工具已经能够从各种图像格式生成 PNG 文件 我将完整的源代码上传到pastebin com 这样你就可以看到我到目前为止所做的
  • ggplot to png - 自动拉伸图像

    我正在生成一个ggplot plot并将其另存为 png图像 虽然 Rstudio 中生成的绘图根据 y 轴的值进行拉伸 但当我将其另存为时 我会得到一个正方形的图像 png 如何自动获得最佳拉伸图像 png form Function t
  • 通过Windows中的命令行工具合并两个png?

    我正在寻找一个可以通过命令行 Windows 7 使用的工具来合并两个相同大小的 png 到目前为止 我在搜索方面运气不佳 因为我见过的大多数工具都是相当笨重的应用程序 它们似乎不针对简单的操作 我想用覆盖图像中的非透明像素覆盖不透明基本图
  • 从 Shiny (R) pt 下载 png。 2

    这与我之前问过的一个问题有关 从 Shiny R 下载 png https stackoverflow com questions 26764481 downloading png from shiny r 我现在已经创建了多个闪亮的图并下
  • 将 Java 2d 图形图像保存为 .png 文件

    我正在绘制模拟生成的信息的图形表示 我显示了图表 但我遇到的问题是如何将其保存为 png 当它保存 png 时 文件是全黑的 所以它不是保存我的图形 而是创建一些空白 png 文件 问题是我很难弄清楚如何转换为 BufferedImage
  • PHP imagepng() 正在创建损坏的图像

    我到处寻找可能的解决方案来解决我的问题 不幸的是我似乎无法弄清楚 我有一个 php 文件 它根据其他图像创建图像 我让脚本完全按照现在的方式运行 没有任何缺陷 但在摆弄其他一些文件后 它突然停止工作 并在 Firefox Chrome 和
  • png8和png24有什么区别

    我想了解 png 文件的用途 有两种格式可供选择PNG 图像 一个是png8另一个是png24 我想知道如果我在我的html页面会出现错误吗 或者这只是质量问题 只有一种PNG格式 但支持5种颜色类型 http en wikipedia o
  • iPhone 中的 jpg 图像和 2x 图像

    我正在开发 iphone 应用程序并定位iOS 4 0或稍后 我正在尝试将图像添加到 UIImageView 并且图像位于jpeg格式 这就是我到目前为止所做的 UIImageView bgImageView UIImageView all
  • 如何使用Python 2.7.8 |Anaconda 2.1.0(32位)加载png图像?

    我使用 Anaconda 下载 Python 2 7 我使用的是Windows 7 我尝试了以下操作 from Tkinter import Tk Frame Canvas import ImageTk t Tk t title Trans
  • Android 2.2 导致图片颜色失真?

    我的应用程序中有一些 png 文件 我需要在运行时加载这些 并从中获取某些像素的确切颜色 重要的是 我不想缩放这些图片 我不会直接在用户界面上显示它们 它们充当地图 现在 在Android 1 5上 这已经没有问题了 我将这些图像放在 re
  • 使用 zlib 解压缩 PNG

    如何使用 zlib 库解压缩 PNG 文件 我需要在 gcc 编译器下使用 C 读取 PNG 文件 为什么不使用libpng http www libpng org pub png libpng html PNG 文件格式相当简单 但有许多
  • 使用 Win32 / C++ 读取 PNG

    没有simple在本机 Windows 中将 PNG 文件读入内存位图的方法似乎是不可能的 但经过多次谷歌搜索后我开始相信它 libpng zlib 组合太大了 有任何第三方库 Win32 库可以读取 PNG 吗 编辑 boost gil
  • 将 PNG 从预乘 alpha 转换为传统的 alpha 透明度?

    我在处理一些具有预乘 Alpha 的 PNG 格式的源图像时遇到了很大的困难 因为大多数工具根本无法正确支持它 有没有什么可以将 最佳猜测 转换为更传统的PNG 如果 预乘 alpha 指的是 iOS 的 PNG 衍生品 那么您可以将它们转
  • 使用pylab同时显示两个png图像

    我想打开两个 png 图像文件并将它们并排显示以进行视觉比较 我有以下代码用于打开一个 png 文件 我从 stackoverflow com 上的 unutbu 获得 import numpy as np import pylab imp
  • 如何在Python 3.7中使用Pygame显示用Pillow加载的图像?

    我使用以下命令将图像导入到我的项目中 from PIL import Image myImage Image open myImageDirectory png 所以 myImage 现在作为 png 文件导入 但我想使用 Pygame 将
  • 如何使用 c 使用 libpng 更改 png 图像的 RGB 值?

    更改 png 图像的 rgb 值的推荐方法是什么 现在我正在使用示例代码来查看 libpng 的工作方式 它只打开一个 png 图像并写入另一个 png 图像 但是我想更改这个新图像的 RGB 值 使其变为全蓝色 绿色或红色 无论我选择什么
  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技

随机推荐

  • win7系统打开定位服务器地址,win7 定位服务器地址

    win7 定位服务器地址 内容精选 换一换 您可以通过云日志服务 查看访问七层共享型负载均衡请求的详细日志记录 分析负载均衡的响应状态码 快速定位异常的后端服务器 您已经创建了七层负载均衡 您已经开通了云日志服务 登录管理控制台 在管理控制
  • 函数式组件与类组件有何不同?

    与React类组件相比 React函数式组件究竟有何不同 在过去一段时间里 典型的回答是类组件提供了更多的特性 比如state 当有了Hooks后 答案就不再是这样了 或许你曾听过它们中的某一个在性能上的表现优于另一个 那是哪一个 很多此类
  • MultipartFile实现文件上传和下载(Springboot)

    MultipartFile是SpringMVC提供简化上传操作的工具类 在不使用框架之前 都是使用原生的HttpServletRequest来接收上传的数据 文件是以二进制流传递到后端的 然后需要我们自己转换为File类 使用了Multip
  • 计算机专业选修课怎么选比较好,大一选修课选什么好 大学选修课推荐

    大学之于高中最大的不同点除了越来越多的自由时间以外 大学有各种各样的选修课供我们选择 在专业课之余 还可以选择其他自己感兴趣的学科进行学习 同时也能给自己增加一项技能 大学热门选修课 1 职场礼仪 礼仪是永远不会过时的 它是一个人的修养素质
  • 语法6:raise - 触发异常

    目录 1 基础格式 2 raise 单独语句 3 raise class 4 raise instance 5 raise from 6 try raise 实现循环跳出
  • JDK的命令行工具——修改中

    目录 一 jps 虚拟机进程状况工具 二 jstat 虚拟机统计信息监视工具 三 jinfo java配置信息工具 四 jmap java内存映像工具 五 jhat 虚拟机堆转储快照分析工具 仅做了解即可 六 jstack java堆栈跟踪
  • 以太坊私有网络的设置与体验

    记录一下搭建一个以太坊私有网络环境的过程 方便以后的开发 我这里采用的是Geth客户端 在geth ethereum org网站上有详细的文档介绍 这里主要是按照官网的教程来操作 安装 我是Ubuntu的环境 执行以下命令来安装 sudo
  • 使用hydra进行FTP认证破解

    hydra入门 hydra是什么 hydra的安装 hydra的基本使用 熟悉常见协议 HTTP协议 FTP协议 SSH协议 Telnet协议 熟悉hydra的参数 基本参数 高级参数 使用方法 使用hydra进行HTTP认证破解 HTTP
  • 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例

    通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 什么是串口 串口分类 USART UART RS232 RS485的区别 串口协议原理 传输协议 需要定义的参数 发送函数USART SendDat
  • Java是一门什么语言?

    个人理解 Java代码需要先编译成class 然后交给JVM执行 而JVM在执行class代码时是解释执行的 所以Java不是一门单纯的编译型或解释型语言 它是一门混合型语言 它是集编译型语言和解释型语言的优势于一身 即执行速度较快 只需编
  • 微调(fine-tuning)

    微调 fine tuing 是一种迁移学习 transfer learning 方法 在迁移学习过程中 预训练的模型的权重会根据新数据进行训练和调整
  • Python工程师面试必备25条知识点

    1 到底什么是Python 你可以在回答中与其他技术进行对比 Python是一种解释型语言 与C语言和C的衍生语言不同 Python代码在运行之前不需要编译 其他解释型语言还包括PHP和Ruby Python是动态类型语言 指的是你在声明变
  • Vue实现高德地图信息窗

  • 操作系统——读者写者问题(写者优先)

    阅读前提醒 本文代码为伪代码 仅供理解 马上就要被关得精神失常了 也许这是我的最后一条博客了吧 啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈水文来咯 1 什么是读者写者问题 一个数据文件或记录可被多个进程共享
  • 当pytest遇上poium会擦出什么火花 ?

    首先 创建一个test sample test demo py 文件 写入下面三行代码 def test bing page page get https www bing com assert page get title 必应 不要问题
  • 栈和队列-P79-9

    队列的最大容量为MaxSize 这句话并不是说该队列存满时的元素个数为MaxSize 这一种情况是最大容量为MaxSize 没有申请其他数据成员 判断队列满的条件是Q front Q rear 1 MaxSize 解释 通俗的解释 Q re
  • 强化学习:带起始探索的每次访问同策回合更新算法求解机器人找金币问题

    1 问题描述 2 环境建模 3 游戏环境类roadenv 设计 class roadenv def init self epsilon 0 5 gamma 0 8 状态空间 动作空间 self states 1 2 3 4 5 6 7 8
  • Python 线程池 ThreadPoolExecutor

    线程池 以前我们定义多线程任务的时候都是通过循环来控制线程数量 很不优雅 import threading class MyThread threading Thread def init self threadID name counte
  • 如何比较PixelCNN与DCGAN两种Image generation方法?

    今天组会读了一下deepmind的PixelCNN nips的那篇 不是很明白到底为什么follow的work这么多 而且pixel rnn还拿了best paper award 感觉pixel by pixel生成是一种非常反直觉的生成方
  • png格式解码库移植过程详解

    1 zlib库和png库的源码获取 1 zlib库源码下载网址 http www zlib net 2 libpng库源码下载网址 ftp ftp simplesystems org pub libpng png src libpng16