libpng+VS2012(VS2015)的使用
OpenCV保存PNG图像底层调用的就是libpng库,简要说一下libPNG库的单独使用。
1.首先需要下载两个库,一个是libpng,一个是zlib
libpng库下载地址:http://www.libpng.org/pub/png/libpng.html
zlib库下载地址:http://www.zlib.net/
2.将两个库下载后解压到同一个文件目录下,如图:

3. 打开libpng库文件目录:\lpng1632\projects\vstudio中,用记事本打开zlib.props配置文件,对应修改zlib库的版本并保存,如下图,我用的是zlib-1.2.11

4.打开同目录下的vstudio解决方案,然后直接在debug或者release模式编译,win32或者x64均可。我用VS2012编译没有任何异常,全部成功,VS2015出现一些错误提示,但是不影响lib库的生成.

5.编译后得到的lib库和dll文件分别在同目录的Debug和Release文件中,x64下编译会在x64文件中。我们需要的是其中的libpng16.lib,libpng16.dll和zlib.lib三个文件。

6.新建VS项目,VC++目录中的包含目录分别设置为libpng库和zlib库所在路径,库目录设置为刚刚生成的lib库所在目录,链接器->输入中将两个lib库名称添加进去,并将libpng16.dll放进工程的可执行文件目录中。(其实跟配置Opencv一样一样的)
以上配置完毕,可以调用libpng库中的接口API进行图像的读写操作了,可以参考libpng库目录中的example.c文件,里面有API的说明。具体的读写代码网上也都能找到。
我列出自己简单编写的写入png图像的代码,读入lena.jpg,保存为lena.png。代码如下,仅供参考。
#include <opencv2\opencv.hpp>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <png.h>
#include <zlib.h> using namespace cv; int write_png_file(char *file_name , Mat srcImg, int imgW, int imgH, int channels)
{
uchar* pImgData=(uchar*)srcImg.data;
int j, i, temp, pos;
png_byte color_type; png_structp png_ptr;
png_infop info_ptr;
png_bytep * row_pointers;
/* create file */
FILE *fp = fopen(file_name, "wb");
if (!fp)
{
printf("[write_png_file] File %s could not be opened for writing", file_name);
return -;
} /* initialize stuff */
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr)
{
printf("[write_png_file] png_create_write_struct failed");
return -;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
printf("[write_png_file] png_create_info_struct failed");
return -;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
printf("[write_png_file] Error during init_io");
return -;
}
png_init_io(png_ptr, fp); /* write header */
if (setjmp(png_jmpbuf(png_ptr)))
{
printf("[write_png_file] Error during writing header");
return -;
}
/* 判断要写入至文件的图片数据是否有透明度,来选择色彩类型 */
if(channels == )
{
color_type = PNG_COLOR_TYPE_RGB_ALPHA;
}
else if(channels==)
{
color_type = PNG_COLOR_TYPE_GRAY;
}
else
{
color_type = PNG_COLOR_TYPE_RGB;
} png_set_IHDR(png_ptr, info_ptr, imgW, imgH,
, color_type, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); /* write bytes */
if (setjmp(png_jmpbuf(png_ptr)))
{
printf("[write_png_file] Error during writing bytes");
return -;
}
if(channels == )
{
temp = ( * imgW);
}
else if(channels == )
{
temp = ( imgW);
}
else
{
temp = ( *imgW);
} row_pointers = (png_bytep*)malloc(imgH*sizeof(png_bytep));
for(i = ; i < imgH; i++)
{
row_pointers[i] = (png_bytep)malloc(sizeof(uchar)*temp);
for(j = ; j < imgW; j += )
{
if(channels==)
{
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // blue
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // green
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // red
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // alpha
}
else if(channels==)
{
row_pointers[i][j] = pImgData[i*imgW+ j]; // gray
}
else
{
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // blue
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // green
row_pointers[i][j*+] = pImgData[i*imgW*+ j*+]; // red
}
}
}
png_write_image(png_ptr, row_pointers); /* end write */
if (setjmp(png_jmpbuf(png_ptr)))
{
printf("[write_png_file] Error during end of write");
return -;
}
png_write_end(png_ptr, NULL); /* cleanup heap allocation */
for (j=; j<imgH; j++)
{
free(row_pointers[j]);
}
free(row_pointers); fclose(fp);
return ;
} void main()
{
Mat img=imread("lena.jpg", );
namedWindow("lena");
imshow("lena",img);
waitKey();
char imgName[]="lena.png";
int imgWidth=img.cols;
int imgHeight=img.rows;
int channels=img.channels();
write_png_file(imgName , img, imgWidth, imgHeight, channels); getchar();
}
libpng+VS2012(VS2015)的使用的更多相关文章
- VS2012 VS2015打开项目加载失败
VS2012 VS2015打开项目加载失败 改成这个$(MSBuildToolsVersion)试试
- Atitit. visual studio vs2003 vs2005 vs2008 VS2010 vs2012 vs2015新特性 新功能.doc
Atitit. visual studio vs2003 vs2005 vs2008 VS2010 vs2012 vs2015新特性 新功能.doc 1.1. Visual Studio2 1.2. ...
- VS2010/VS2012/VS2015下openGL环境配置(转)
按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...
- VS2012 VS2015 的项目配置模板及其目录
建立的项目多了的时候 , 就希望能自己配置好一个项目模板,以后建立的项目自动使用这个模板就省事了,不用每次都要改, 每个项目都要改了! 经不懈努力, 终于 发现了 vs2015,vs2012 (我只用 ...
- [libpng]CMake+VS2015下编译libpng,及使用小例
编译前的工作 在编译libpng前,需要把zlib编译好,并加载到编译环境里. CMake + VS2015 下编译zlib,及使用小例 下载与解压 libpng的官网是 http://www.lib ...
- VS2010,VS2012,VS2015等的自动提示不能默认选中的功能解决办法
很简单,只需要按 ctrl+alt+space 即可切换. 蛋疼,我到底为什么总会不小心切换过去,而且每次都记不住这个快捷键切换回来...
- AnkhSVN 中文版 支持VS2015
简介:AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交,而且该插件属于开源项目. 这个版本是简体中文的重新编译版本 ...
- .Net工程详解及项目版本管理
前言 写这篇文章的目地是为了让更多的小伙伴对VS生成的工程有一个清晰的认识.在开发过程中,为了赶进度,并不是每个人都有学习的时间. 但如果上层项目管理人员对这些工程目录不熟悉的话,把VS编译的中间文件 ...
- vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 在安装 VS2010 后,再安装 VS2012 VS2015 等,原来的 .N ...
随机推荐
- C# Excel数据导入到数据库
http://www.jb51.net/article/44743.htm 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 复制代码 代码如下: using System ...
- 如何高逼格读取Web.config中的AppSettings
http://edi.wang/post/2015/4/22/how-to-read-webconfig-appsettings-with-bigiblity 先插句题外话,下版本的ASP.NET貌似 ...
- .Net WinForm 控件键盘消息处理剖析
在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等 ...
- 微信小程序开发之模板消息
一.添加模板 登录https://mp.weixin.qq.com获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用,详见模板审核说明 页面的 <form/> 组件,属性r ...
- angular4.0配置本机IP访问项目
一.查看本机IP 命令行输入 ipconfig,在面板中选择IPv4地址 二.在项目中配置IP 打开package.json文件,修改如下 三.命令行运行 npm start 四.在手机上访问 192 ...
- display:box;display:flex;弹性盒模型
display:box:display:flex:弹性盒模型 非常适用于移动端.PC端高级浏览器,效果也很好. display: -webkit-box; display: -moz-box; dis ...
- 纯CSS二级纵向菜单
纯CSS二级纵向菜单 <body> <div class="divda"> <div class="nav"> <ul ...
- css多重边框
一.使用box-shadow实现多重边框 html <div class="multiple"></div> css .multiple{ backgrou ...
- iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】
简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...
- 【数论·错位排列】bzoj4517 排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1428 Solved: 872[Submit][Statu ...