1)实现BMP图像处理类 class BMPmanager,需要实现构造和析构,图像读入初始化 (2)实现反色方法Inverse()(红绿反色) (3)实现黑白化方法bw()(超过128为白色,低于128为黑色)
时间: 2024-01-26 22:03:21 浏览: 46
python图像处理之反色实现方法
好的,我明白了。下面是对应的代码实现:
```cpp
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class BMPmanager {
private:
char* data; // 存储图像数据的数组
int width;
int height;
public:
BMPmanager(const char* filename) {
ifstream fin(filename, ios::binary);
if (!fin) {
cerr << "Error: cannot open file " << filename << endl;
exit(1);
}
// 读取BMP文件头信息
char header[54];
fin.read(header, 54);
if (header[0] != 'B' || header[1] != 'M') {
cerr << "Error: invalid BMP file " << filename << endl;
exit(1);
}
// 读取图像宽度和高度
width = *(int*)(header + 18);
height = *(int*)(header + 22);
// 计算每行像素所占字节数(必须为4的倍数)
int numBytesPerRow = ((width * 3 + 3) / 4) * 4;
// 计算图像数据大小
int dataSize = numBytesPerRow * height;
// 读取图像数据
data = new char[dataSize];
fin.read(data, dataSize);
fin.close();
}
~BMPmanager() {
delete[] data;
}
void Inverse() {
int numBytesPerRow = ((width * 3 + 3) / 4) * 4;
for (int y = 0; y < height; y++) {
char* row = data + y * numBytesPerRow;
for (int x = 0; x < width; x++) {
int offset = x * 3;
row[offset] = 255 - row[offset]; // 反色(红)
row[offset + 1] = 255 - row[offset + 1]; // 反色(绿)
}
}
}
void bw() {
int numBytesPerRow = ((width * 3 + 3) / 4) * 4;
for (int y = 0; y < height; y++) {
char* row = data + y * numBytesPerRow;
for (int x = 0; x < width; x++) {
int offset = x * 3;
int gray = (row[offset] + row[offset + 1] + row[offset + 2]) / 3;
if (gray >= 128) {
row[offset] = 255; // 白
row[offset + 1] = 255;
row[offset + 2] = 255;
} else {
row[offset] = 0; // 黑
row[offset + 1] = 0;
row[offset + 2] = 0;
}
}
}
}
};
int main() {
BMPmanager bmp("test.bmp");
bmp.Inverse(); // 反色
bmp.bw(); // 黑白化
return 0;
}
```
这个类中,构造函数会读取指定的BMP图像文件,并存储图像数据。析构函数会释放内存。`Inverse()` 方法会将图像中的红色和绿色进行反色处理。`bw()` 方法会将图像变为黑白二值图像,超过128的像素值变为白色,低于128的像素值变为黑色。
阅读全文