注意不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U)
保存PNG格式的时候可以保存透明通道的图片
可以指定压缩参数
如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)。另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中
//IDE:VS2019
#include<opencv2/opencv.hpp>
#include<iostream>
#include <vector>
int main(int argc, char** argv) {
cv::Mat img = cv::imread("D:/bb/tu/sansui.jpg");
std::vector< int > par; //创建vector对象,用来存储质量压缩信息
par.push_back(cv::IMWRITE_JPEG_QUALITY); //jpg格式
par.push_back(50);
cv::imwrite("D:/bb/tu/test.jpg", img,par); //保存图像
/*参数3:该参数是一个vector<int>类型, 表示为特定格式保存的参数编码,它有一个默认值std::vector< int >(),所以一般情况下不用写
里面分别存入paramId_1, paramValue_1, paramId_2, paramValue_2, ... 也就是说存入一对属性值。如果不设置该参数的话,则程序会自动根据所保存的图像格式采用一个默认的参数
如果更改的话,对于不同的图片格式,其对应的值不同功能不同,如下:
对于JPEG格式的图片,这个参数表示从0-100的图片质量(cv::IMWRITE_JPEG_QUALITY),默认值是95
对于PNG格式的图片,这个参数表示压缩级别(cv::IMWRITE_PNG_COMPRESSION)从0-9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3
对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(cv::IMWRITE_PXM_BINARY),取值为0或1,而默认值为1
*/
cv::waitKey();
return 0;
}