用C/C++语言写一个基于行程编码的算法实现图片压缩和解压缩,并将压缩文件和解压缩文件保存到电脑路径中,可以使用opencv库
时间: 2024-03-08 08:50:39 浏览: 316
基于C++和算法实现的压缩与解压程序【100012988】
好的,这里是一个基于C++和OpenCV库的实现示例,包括图片压缩和解压缩,并将压缩文件和解压缩文件保存到指定路径中。
```c++
#include <iostream>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void encode(const Mat& src, vector<pair<int, int>>& output) {
int rows = src.rows, cols = src.cols;
for (int r = 0; r < rows; r++) {
uchar* ptr = src.ptr<uchar>(r);
int start = -1;
for (int c = 0; c < cols; c++) {
if (ptr[c] != 0) {
if (start == -1) {
start = c;
}
}
else {
if (start != -1) {
output.push_back(make_pair(start, c - start));
start = -1;
}
}
}
if (start != -1) {
output.push_back(make_pair(start, cols - start));
}
}
}
void decode(Mat& dst, const vector<pair<int, int>>& input) {
dst.setTo(0);
for (auto p : input) {
int start = p.first, count = p.second;
for (int i = 0; i < count; i++) {
dst.at<uchar>(p.first / dst.cols, start + i) = 255;
}
}
}
void compress(const string& filename, const Mat& src) {
vector<pair<int, int>> output;
encode(src, output);
ofstream fout(filename, ios::binary);
int rows = src.rows, cols = src.cols;
fout.write(reinterpret_cast<const char*>(&rows), sizeof(rows));
fout.write(reinterpret_cast<const char*>(&cols), sizeof(cols));
int count = output.size();
fout.write(reinterpret_cast<const char*>(&count), sizeof(count));
fout.write(reinterpret_cast<const char*>(output.data()), count * sizeof(pair<int, int>));
fout.close();
}
void decompress(const string& filename, Mat& dst) {
ifstream fin(filename, ios::binary);
int rows, cols, count;
fin.read(reinterpret_cast<char*>(&rows), sizeof(rows));
fin.read(reinterpret_cast<char*>(&cols), sizeof(cols));
fin.read(reinterpret_cast<char*>(&count), sizeof(count));
vector<pair<int, int>> input(count);
fin.read(reinterpret_cast<char*>(input.data()), count * sizeof(pair<int, int>));
fin.close();
dst.create(rows, cols, CV_8U);
decode(dst, input);
}
int main() {
Mat src = imread("lena.jpg", IMREAD_GRAYSCALE);
imshow("src", src);
compress("lena.rle", src);
Mat dst;
decompress("lena.rle", dst);
imshow("dst", dst);
imwrite("lena_decoded.jpg", dst);
waitKey();
return 0;
}
```
这个实现中,我们定义了两个函数 `compress` 和 `decompress`,用于将输入的灰度图像进行压缩和解压缩。具体来说,压缩函数 `compress` 中,我们首先调用之前定义的行程编码函数 `encode` 将图像进行行程编码,然后将编码后的行程数据和图像的大小信息写入到输出文件中。解压缩函数 `decompress` 中,我们则是从输入文件中读取图像的大小信息和行程数据,并调用之前定义的行程解码函数 `decode` 将其解码为一张灰度图像。
最后,我们在 `main` 函数中加载了一张灰度图像 `lena.jpg`,并将其进行了压缩和解压缩。我们可以将解压缩后的结果显示出来,以验证解压缩的正确性,并将解压缩后的图像保存到 `lena_decoded.jpg` 文件中。
阅读全文