[libpng]CMake+VS2015下编译libpng,及使用小例
编译前的工作
在编译libpng前,需要把zlib编译好,并加载到编译环境里。
下载与解压
libpng的官网是 http://www.libpng.org/pub/png/libpng.html ,但它的源码是存在 https://sourceforge.net 上的;具体最新的版本可以先进官网看看,再点连接过去下载

我当前的版本是libpng 1.6.36:

把里面的文件解压出来

CMake创建工程
看了一下,CMakeLists.txt就在这个目录下,用CMake加载一下;在Cmake-gui里,设置好source code 和build the binaries,就点击一下【Configure】:

加载后,别急着【Generate】需要设置一下编译后的lib、dll和头文件的安装路径了,第一次我建议设定源码目录下的路径,方便看一下编译后生成了哪些文件,不然的话可以直接设置为您本机的VC的路径【注意:不是VS的路径,而是VS下VC的路径,这是个人建议,不喜欢的后面给另外一个方法】:

设置好这再【Generate】,基本不会再出什么问题了,就可以点击【Open Project】打开工程:

不安装到VC路径下
如果不喜欢把libpng安装到VC路径下时,还是需要设定安装的路径,但在安装后,需要把您设定的安装路径添加到环境变量中的Path里。
如果是用VS创建工程的, 就需要把头文件、lib和dll这些的路径添加到工程属性里。
但用CMake可以去掉手动配置的这一步, 但必须把库的安装路径添加到环境变量里,不然CMake是没查找到这个库的。本人做个测试, 如果不对可以评论指正!
编译与安装
编译
使用CMake+VS2015编译的过程很简单,经过前面的配置工作后,打开工程后,就直接右键解决方案,再点击【生成解决方案】:

之后就是等待了,还好libpng比较小,编译很快的:


安装
在编译成功后,这时就需要把编译生成的文件安装到前面设定好的目录下;看【解决方案】下方,有一个项目的名字为【INSTALL】,只要右键【INSTALL】→
【仅用于项目】→【仅生成INSTALL】


ok, 已经安装完毕:

小贴示
看到编译生成的文件名竟然带有版本号信息,我有点小小强迫症,所以我想去,这就需要修改一下CMake配置文件CMakeLists.txt:


这个时候回去cmake-gui需要删除之前缓存,再Configure和Generate,并重新编译就好了。
使用libpng生成图片
因为用了CMake后,基本很少用VS里的功能来创建工程了:
生成一个png图片
CMakeLists.txt
cmake_minimum_required(VERSION 3.0) project(PngDemoEx1) aux_source_directory(. SRC) link_libraries(debug libpngd) #设置Debug时使用libpngd.lib
link_libraries(optimized libpng) #设置非Debug时使用libpng.lib add_executable(${PROJECT_NAME} ${SRC})
main.cpp
#include <png.h>
#include <stdio.h>
#include <iostream>
using namespace std; int main(int argc, char* argv[])
{ png_structp ppng = NULL;//libpng的结构体
png_infop pinfo = NULL;//libpng的信息 //打开一个保存png的文件流
FILE* fpng = fopen("tt.png", "wb"); //创建一个png_structp结构体实例ppng
ppng = png_create_write_struct(PNG_LIBPNG_VER_STRING, , , );
if (!ppng) {
printf("png_create_write_struct failed ...\n");
return -;
}
png_init_io(ppng, fpng); //把ppng与文件流绑定起来
if (setjmp(png_jmpbuf(ppng))) {
printf("error during init_io ...\n");
return -;
}
//用png_structp结构体创建一个png_infop结构体实例pinfo,个人理解这是png相关头信息的结构体
pinfo = png_create_info_struct(ppng);
if (!pinfo) {
printf("png_create_info_struct failed ...\n");
return -;
}
png_set_IHDR(ppng, pinfo,
, ,//尺寸
,//颜色深度,也就是每个颜色成分占用位数(8表示8位红8位绿8位蓝,如果有透明通道则还会有8位不透明度)
PNG_COLOR_TYPE_RGB,//颜色类型,PNG_COLOR_TYPE_RGB表示24位真彩深色,PNG_COLOR_TYPE_RGBA表示32位带透明通道真彩色
PNG_INTERLACE_NONE,//不交错。PNG_INTERLACE_ADAM7表示这个PNG文件是交错格式。交错格式的PNG文件在网络传输的时候能以最快速度显示出图像的大致样子。
PNG_COMPRESSION_TYPE_BASE,//压缩方式
PNG_FILTER_TYPE_BASE);//这个不知道,总之填写PNG_FILTER_TYPE_BASE即可。
png_write_info(ppng, pinfo);
png_set_packing(ppng);//设置打包信息
png_write_info(ppng, pinfo);//写入文件头 //定义行数组,是一个指向指针的数组,数组中每一个指向一行的像素数组
png_bytepp data = new png_bytep[];
for (size_t i = ; i < ; i++)
{
data[i] = new png_byte[]{0x23,0x32, 0x25, 0x21, 0x89};//定义一行像素数组
}
//把像素数据写入png_structp结构体实例ppng中
png_write_image(ppng, (png_bytepp)data);
//写入png结束信息
png_write_end(ppng, pinfo); //后面都是清理,回收内存
for (size_t i = ; i < ; i++)
{
delete[]data[i];
}
delete[]data;
png_destroy_write_struct(&ppng, &pinfo);
fclose(fpng);
return ;
}
总结一下
之前第一次使用时,遇到一个问题,一开始只编译安装了libpng的Release版,但在使用的时候工程是Debug版的,编译过了,但运行时就一直提示一个异常:

其解决方法是编译版对应的,在开发中Debug就用debug版的libpng,Release就对应Release版的libpng。
读取png,生成RGB数据文件
- 打开png文件的文件流
- 从文件流中读四个字节,做PNG签字验证
- 重置流的位置
- 定义png_structp指针并创建结构体png_struct实例
- 定义png_infop指针并创建结构体png_info实例
- png_init_io初始化png_struct实例的文件流
- png_read_png读取png图片信息与数据
- png_get_color_type
- png_get_image_width 与 png_get_image_height
- png_get_rows
- png_destroy_read_struct 释放png_struct实例和png_info实例
- 关闭文件流
#include <stdio.h>
#include <png.h>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#define PNG_SIGN_SIZE 4
int main(int argc, char* argv[])
{
int ret = ;
FILE* fpng = fopen("tt.png", "rb");
if (fpng == NULL)
{
cerr << "open png file error" << endl;
return __LINE__;
} char png_sign_buf[PNG_SIGN_SIZE] = {};
ret = fread(png_sign_buf, sizeof(char), PNG_SIGN_SIZE, fpng);
if (ret < PNG_SIGN_SIZE)
{
cerr << "数据长度不足" << PNG_SIGN_SIZE << "个字节" << endl;
fclose(fpng);
return __LINE__;
} ret = png_sig_cmp((png_bytep)png_sign_buf, , PNG_SIGN_SIZE);
if (ret != )
{
cerr << "lPNG的签名不正确" << endl;
fclose(fpng);
return __LINE__;
} rewind(fpng);/* 复位文件指针 */ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, , , );
png_infop info_ptr = png_create_info_struct(png_ptr); png_init_io(png_ptr, fpng);
/* 读取PNG图片信息和像素数据 */
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, NULL);
/* 获取图像的色彩类型 */
int color_type = png_get_color_type(png_ptr, info_ptr); int width = png_get_image_width(png_ptr, info_ptr);
int height = png_get_image_height(png_ptr, info_ptr); png_bytepp rows_ptr;
rows_ptr = png_get_rows(png_ptr, info_ptr); int channel = color_type == PNG_COLOR_TYPE_RGB ? : ; stringstream ss;
ss << "tt_" << width << "x" << height << ".rgb"; FILE* frgb = fopen(ss.str().c_str(), "wb"); if (frgb != NULL)
{
for (int h = ; h < height; h++)
{
for (int w = ; w < width; w++)
{
fwrite((void*)&rows_ptr[h][w*channel], sizeof(char), , frgb);
}
}
fclose(frgb);
} png_destroy_read_struct(&png_ptr, &info_ptr, );
fclose(fpng); return ;
}
这个实例,把png图片文件中的RGB读取出来保存了,如果需要查看RGB数据文件,可以用相关工具看的
[libpng]CMake+VS2015下编译libpng,及使用小例的更多相关文章
- [zlib] CMake + VS2015 下编译zlib,及使用小例
下载与解压 可以到zlib官网 http://zlib.net/ 下载,这个没有被墙的,如果下载,试一下换个网络再访问.因为我在公司的网络是访问不了的. 我当前使用的是 zlib1.2.11版本. 下 ...
- vs2015下编译免费开源的jpeg库,ijg的jpeg.lib
vs2015下编译免费开源的jpeg库,ijg的jpeg.lib 1. 去Independent JPEG Group官网www.ijg.org下载jpegsrc,我下载的版本是jpegsrc9c.z ...
- Win7 64位 VS2015环境编译Libpng
第3次编译Libpng依然想不起任何东西,为了不浪费第4次的时间... http://libmng.com/pub/png/libpng.html http://www.zlib.net/ 解压两个压 ...
- Win7 VS2015环境编译Libpng
第3次编译Libpng依然想不起任何东西,为了不浪费第4次的时间... http://libpng.com/pub/png/libpng.html http://www.zlib.net/ 解压两个压 ...
- Visual Studio 2015 下 编译 libpng
libpng https://github.com/glennrp/libpng zlib https://github.com/madler/zlib/releases https://github ...
- VS2015下编译64位GDAL总结
使用VS2015编译最新的64位GDAL(最新gdal2.11),确实有一些问题,看来双方还是太新了,有点不兼容,特总结如下. 以前经常用的通过VisualStudio IDE进行编译的方式现在似乎不 ...
- Win10 + VS2015 下编译 Qt5.6.0
近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...
- Windows7 VS2015 下编译 PythonQt3.2
本文在使用vs2015编译python3.6.7源代码后,编译的PythonQt3.2.如果使用python二进制文件进行安装,注意python的路径即可 本机环境: 1.win7 64 旗舰版 2. ...
- vs2015下编译duilib的几个问题
duilib下载地址在github 用vs2015打开,提示升级工程,确认后继续. 编译,UIGifAnim.cpp 323行报错 1>Control\UIGifAnim.cpp(324): e ...
随机推荐
- 再有人问你HashMap,把这篇文章甩给他!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java==集合中的精髓==了,如果你觉得自己对 ...
- 普及C组第一题(8.1)
1999. [2015.8.6普及组模拟赛]Wexley接苹果(apple) 题目: Wexley最近发现了一个古老的屏幕游戏.游戏的屏幕被划分成n列.在屏幕的底端,有一个宽为m列的篮子(m<n ...
- 大组合数Lucas
https://blog.csdn.net/sr_19930829/article/details/39058487 LL Lucas(LL n, LL m, int p){ ; } Saving B ...
- 读书小记--<如何阅读一本书 >
目录 阅读的活力与艺术 基础阅读 检视阅读 分析阅读 主题阅读 阅读与心智成长 之前看到一位科大的博主,在考研期间看了很多书,同时也看了很多课外书籍,TA说希望能够陶冶自己的性情.看到这,我想起了 ...
- Win下PHP5.6版本安装redis扩展
首先说一下自己的环境啥的,我用的是phpstudy,其实没啥大用,就是看你的php版本啥的 1.运行phpinfo(),查看php的信息,php的位数和扩展信息,和要下载的扩展文件信息有关, 2.下载 ...
- 介绍Mobility Group
Mobility或Roaming是无线客户端能够安全地从一个AP无缝关联到另一个AP的能力,并且延迟尽可能的短. 当无线客户端和AP关联并通过AP进行身份验证时,注册AP的WLC会将客户端条目放在自己 ...
- Smart License
思科启动了通过构建思科智能软件管理器门户来简化客户许可管理的计划. 它可以帮助客户了解他们购买的许可证以及他们使用的许可证. 其他各种思科产品已经启用Smart Enabled,随着此版本(我这里学习 ...
- 让 typora和word一样好用
让 typora和word一样好用 :https://github.com/itcastWsy/typora_copy_images typora是一款支持实时预览的markdown编辑器,作者在使 ...
- Codeforces 1313C.Skyscrapers
题目链接 题意是给你一个数组,问你如何建造,使得每个点都不小于其左右的点,包括不相邻的点 分析题意,容易得知,就是找一个点两侧的不上升序列且带修,那我们就分别从头跑一遍,从尾跑一遍,两者相加就是每个点 ...
- Python web在IIS上发布方法和原理
Python web应用想要发布使用iis发布有两种方式,这篇文章就为大家介绍一下这两种方式的具体实现: 1.配置HttpPlatform程序 HttpPlatform 模块将套接字连接直接传递到独立 ...