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)的使用的更多相关文章

  1. VS2012 VS2015打开项目加载失败

    VS2012 VS2015打开项目加载失败 改成这个$(MSBuildToolsVersion)试试

  2. 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. ...

  3. VS2010/VS2012/VS2015下openGL环境配置(转)

    按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...

  4. VS2012 VS2015 的项目配置模板及其目录

    建立的项目多了的时候 , 就希望能自己配置好一个项目模板,以后建立的项目自动使用这个模板就省事了,不用每次都要改, 每个项目都要改了! 经不懈努力, 终于 发现了 vs2015,vs2012 (我只用 ...

  5. [libpng]CMake+VS2015下编译libpng,及使用小例

    编译前的工作 在编译libpng前,需要把zlib编译好,并加载到编译环境里. CMake + VS2015 下编译zlib,及使用小例 下载与解压 libpng的官网是 http://www.lib ...

  6. VS2010,VS2012,VS2015等的自动提示不能默认选中的功能解决办法

    很简单,只需要按 ctrl+alt+space 即可切换. 蛋疼,我到底为什么总会不小心切换过去,而且每次都记不住这个快捷键切换回来...

  7. AnkhSVN 中文版 支持VS2015

    简介:AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交,而且该插件属于开源项目. 这个版本是简体中文的重新编译版本 ...

  8. .Net工程详解及项目版本管理

    前言 写这篇文章的目地是为了让更多的小伙伴对VS生成的工程有一个清晰的认识.在开发过程中,为了赶进度,并不是每个人都有学习的时间. 但如果上层项目管理人员对这些工程目录不熟悉的话,把VS编译的中间文件 ...

  9. vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 在安装 VS2010 后,再安装 VS2012 VS2015 等,原来的 .N ...

随机推荐

  1. JavaScript的DOM编程--11--插入节点

    插入节点: 1). insertBefore(): 把一个给定节点插入到一个给定元素节点的给定子节点的前面 var reference = element.insertBefore(newNode,t ...

  2. Linux文件的复制、删除和移动命令

    cp命令  功能:将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大.  语法:cp [选项] 源文件或目录 目标文件或目录  说明:该命令把指定的源文件复制到目 ...

  3. SpringMVC 支持使用Servlet原生API作为目标方法的参数

    具体支持一下类型: * HttpServletRequest * HttpServletResponse * HttpSession * java.security.Pricipal * Locale ...

  4. 浏览器根对象window之screen

    1. screen 1.1 availHeight/Width screen.availWidth返回浏览器窗口可占用的水平宽度(单位:像素). screen.availHeight返回浏览器窗口在屏 ...

  5. Ubuntu初始化MySQL碰到的坑

    想着将MySQL初始化,改变一下存放数据文件的位置: root@ubuntu:/lvmdata# mkdir data root@ubuntu:/lvmdata# chown -R mysql:mys ...

  6. 第六章:Python基础の反射与常用模块解密

    本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...

  7. Mac 下 android/iOS https抓包

    一.Charles简介 Charles,是用Java开发的,所以跨平台,不仅可以在Mac上使用,Linux以及Window下都是可以使用的,当然需要安装JDK,才能运行,但目前是收费的. 二.下载 官 ...

  8. left join,right join,inner join

    数据库中left join,right join,inner join的差异 具体详细说明 总的来说: JOIN:                                           ...

  9. Error:C:\Users\issuser\AndroidStudioProjects\SQLiteDemo1\.gradle\buildOutputCleanup\cache.properties (系统找不到指定的文件。)

    android studio报下图中的这个错误的解决办法: 解决办法: 1.删除掉下图中标记的2个文件夹 2.将下图标记的文件的文件名重命名,把最后的后缀.lock去掉,因为加上了这个后缀,所以提示找 ...

  10. PC端截取GIF图片的软件

    PC端截取GIF图片的软件分享:下载>>