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 ...
随机推荐
- chrome调试工具高级不完整使用指南(优化篇)
上一篇文章我们说了chrome调试工具的一些比较基础功能的用法,接下来我们要在这一篇文章中说一说,其他一些chrome调试工具的使用方法 2.1.5 Network模块 在netWork模块中,大致上 ...
- Python 接口自动化(预)
1. HTTP协议:HTTP是接口测试的基础: 2. Fiddler工具:Fiddler所有界面布局及主要布局
- JQueryPagination分页插件,ajax从struts请求数据
2017-07-16 学完了struts,做了个关于分页的小例子,用到了JQuery分页插件Pagination,先贴下插件下载地址 http://www.jq22.com/jquery-info13 ...
- HTTP2.0和QUIC
最近看到腾讯云支持QUIC的文章,突然意识到还没有好好认识HTTP2.QUIC,而要认识HTTP2,就需要从HTTP1.0开始讲起,才能清楚HTTP的发展历程. HTTP1.x HTTP(HyperT ...
- html页面的音频问题
导火线 : 负责了项目中的话务间模块,处理音频出了一点问题 之前的处理 : //循环播放声音 var dialAudioDocument = document.createElement('audio ...
- 用json方法来作深拷贝应该知道的一点东西!
之前写js比较多的的时候也写过深拷贝,浅拷贝,继承啥的,还有自定义的监听事件.然而过了很久都忘了. 最近在项目上用的深拷贝都是 b = JSON.parse( JSON.stringify(a) ) ...
- Ajax方式分页加载列表实现
在前面: 最近需要用到这个功能,所以这几天一直在研究这个,目前大致功能已实现,后续需要完善,但需要的功能点已完成,记录下: 1.分页功能引入bootstrap的分页插件: <script typ ...
- 51Nod 1289 大鱼吃小鱼(模拟,经典好题)
1289 大鱼吃小鱼 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】
弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...
- B. Secret Combination
B. Secret Combination time limit per test 2 seconds memory limit per test 256 megabytes input standa ...