专栏简介 | ||
💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫 | 🧭文章导航🧭 ⬆️ 10.特殊的Mat类汇总(二) ⬇️ 12.HighGui之图像窗口显示 |
Imgcodecs之图像读写
Imgcodecs类用于读取和保存图像。
一、字段
仅列举部分常用的字段
字段 | 描述 |
IMREAD_ANYDEPTH | 如果设置,将返回16位/32位图像,否则将转换为8位 |
IMREAD_COLOR | 指定在加载图像时总是将其作为彩色图像读取,默认设置。如果原始图像是单通道黑白图,它将被转换为彩色图 |
IMREAD_GRAYSCALE | 指定在加载图像时总是将其作为灰度图像(单通道)读取 |
IMREAD_ANYCOLOR | 如果设置,图像将以任何可能的颜色格式读取 |
IMREAD_REDUCED_COLOR_2 | 以彩色模式读取图像,但图像的尺寸被缩小为原始尺寸的1/2 |
IMREAD_REDUCED_GRAYSCALE_2 | 以灰度模式读取图像,但图像的尺寸被缩小为原始尺寸的1/2 |
IMWRITE_PAM_FORMAT_RGB | 表示图像将以红绿蓝(RGB)颜色模型存储,这是彩色图像的标准格式 |
IMWRITE_JPEG_SAMPLING_FACTOR_444 | 设置JPEG色度子采样率为4:4:4,这是最高的色彩分辨率 |
二、读取图像
仅列举部分方法。
1.读取单页图像
1.imread
1.从文件中加载图像
imread(java.lang.String filename, int flags) | |
参数: | |
filename | 要加载的文件的地址 |
flags | 标志,可以是IMREAD_*其一 |
Mat imread = Imgcodecs.imread("img.png",Imgcodecs.IMREAD_GRAYSCALE);
HighGui.imshow("imraed",imread);
HighGui.waitKey();
2.imdecode(Mat buf, int flags)
从内存中的缓冲区读取图像。如果缓冲区太短或包含无效数据,则该函数返回一个空矩阵。
2.读取多页图像
从文件中读取图像序列,特别是多页图像文件(如 TIFF)
1.imreadmulti
imreadmulti(java.lang.String filename, java.util.List mats, int start, int count, int flags) | |
参数: | |
filename | 要加载的文件的地址 |
mats | Mat 对象的列表,用于存储读取的每一页图像 |
start | 指定从文件中的哪一页开始读取 |
count | 指定要读取的页数 |
flags | 标志,可以是IMREAD_*其一 |
2.imdecodemulti
从内存中的缓冲区读取多页图像
3.haveImageReader
如果指定的图像可以被OpenCV解码,则返回true
4.imcount
获取给定文件中的图像数量。
imcount(java.lang.String filename, int flags) | |
参数: | |
filename | 要加载的文件的地址 |
flags | 标志,可以是IMREAD_*其一 |
三、保存图像
将图像写入到文件或缓存中
1.保存单页图像
1.imwrite
imwrite(java.lang.String filename, Mat img, MatOfInt params) | |
参数: | |
filename | 文件的名称 |
img | 要保存的图像 |
params | 特定于格式的参数,以对的形式编码(paramId_1, paramValue_1, paramId_2, paramValue_2, ...) |
Mat imread = Imgcodecs.imread("img.png");
//质量压缩 80%
MatOfInt params = new MatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY,80);
Imgcodecs.imwrite("param.png",imread,params);
请自行验证压缩后的文件大小
2.imencode
将图像编码为内存缓冲区中的数据
imencode(java.lang.String ext, Mat img, MatOfByte buf, MatOfInt params) | |
参数: | |
ext | 定义输出格式的文件扩展名。必须以点开头 |
img | 要写入的图像 |
buf | 调整为适合压缩图像的输出缓冲区 |
params | 特定于格式的参数,以对的形式编码(paramId_1, paramValue_1, paramId_2, paramValue_2, ...) |
Mat imread = Imgcodecs.imread("img.png");
//质量压缩 80%
MatOfInt params = new MatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY,80);
//写入缓存中
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".png",imread,matOfByte,params);
System.out.println("matOfByte = " + matOfByte);
//读取缓存中的数据
Mat imdecode = Imgcodecs.imdecode(matOfByte, Imgcodecs.IMREAD_COLOR);
HighGui.imshow("imdecode",imdecode);
HighGui.waitKey();
请自行验证
2.保存多页图像
1.imwritemulti
将多个图像保存到一个多页图像文件中。
imwritemulti(java.lang.String filename, java.util.List img, MatOfInt params) | |
参数: | |
filename | 要创建的文件的名称 |
img | 一个 Mat 对象的列表,每个 Mat 对象代表一个图像 |
params | 与图像格式相关的参数,例如压缩的类型和质量。这是可选的,具体取决保存的文件格式 |
Mat src1 = Imgcodecs.imread("src1.jpg");
Mat src2 = Imgcodecs.imread("src2.jpg");
List matList = new ArrayList<>();
matList.add(src1);
matList.add(src2);
Imgcodecs.imwritemulti("ims.tif",matList);
2.haveImageWriter
如果具有指定文件名的图像可以被OpenCV编码,则返回true