1)实现BMP图像处理类 class BMPmanager,需要实现构造和析构,图像读入初始化 (2)实现反色方法Inverse()(红绿反色) (3)实现黑白化方法bw()(超过128为白色,低于128为黑色)
时间: 2024-01-26 22:03:21 浏览: 78
以下是实现BMP图像处理类 `BMPmanager` 的代码示例,包括构造和析构,以及图像读入初始化、反色方法 `Inverse()` 和黑白化方法 `bw()`:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#pragma pack(push, 1)
struct BMPHeader {
uint16_t type;
uint32_t size;
uint16_t reserved1;
uint16_t reserved2;
uint32_t offset;
uint32_t header_size;
int32_t width;
int32_t height;
uint16_t planes;
uint16_t bits_per_pixel;
uint32_t compression;
uint32_t image_size;
int32_t x_pixels_per_meter;
int32_t y_pixels_per_meter;
uint32_t colors_used;
uint32_t colors_important;
};
#pragma pack(pop)
class BMPmanager {
public:
BMPmanager(const char* filename);
~BMPmanager();
void Inverse();
void bw();
void save(const char* filename);
private:
BMPHeader header_;
vector<uint8_t> pixels_;
};
BMPmanager::BMPmanager(const char* filename) {
// 读入 BMP 文件
ifstream fin(filename, ios::binary);
if (!fin) {
cerr << "Failed to open file." << endl;
return;
}
// 读入 BMP 头信息
fin.read(reinterpret_cast<char*>(&header_), sizeof(header_));
// 检查文件类型
if (header_.type != 0x4D42) {
cerr << "Invalid file format." << endl;
return;
}
// 检查像素位数
if (header_.bits_per_pixel != 24) {
cerr << "Unsupported pixel format." << endl;
return;
}
// 读入像素数据
pixels_.resize(header_.width * header_.height * 3);
fin.read(reinterpret_cast<char*>(pixels_.data()), pixels_.size());
// 关闭文件
fin.close();
}
BMPmanager::~BMPmanager() {}
void BMPmanager::Inverse() {
for (size_t i = 0; i < pixels_.size(); i += 3) {
pixels_[i] = 255 - pixels_[i]; // 反色:红色通道
pixels_[i + 1] = 255 - pixels_[i + 1]; // 反色:绿色通道
}
}
void BMPmanager::bw() {
for (size_t i = 0; i < pixels_.size(); i += 3) {
uint8_t gray = (pixels_[i] + pixels_[i + 1] + pixels_[i + 2]) / 3;
if (gray > 128) {
pixels_[i] = pixels_[i + 1] = pixels_[i + 2] = 255; // 白色
} else {
pixels_[i] = pixels_[i + 1] = pixels_[i + 2] = 0; // 黑色
}
}
}
void BMPmanager::save(const char* filename) {
// 打开文件
ofstream fout(filename, ios::binary);
if (!fout) {
cerr << "Failed to open file." << endl;
return;
}
// 写入 BMP 头信息
fout.write(reinterpret_cast<char*>(&header_), sizeof(header_));
// 写入像素数据
fout.write(reinterpret_cast<char*>(pixels_.data()), pixels_.size());
// 关闭文件
fout.close();
}
int main() {
BMPmanager bmp("example.bmp"); // 读入 BMP 文件
bmp.Inverse(); // 反色处理
bmp.bw(); // 黑白化处理
bmp.save("output.bmp"); // 保存处理后的 BMP 文件
return 0;
}
```
在上述代码中,我们定义了一个名为 `BMPmanager` 的类,其中包含了图像读入和处理的方法。你可以在读入像素数据之后对其进行任何处理。在 `main()` 函数中,我们读入了一个 BMP 文件,并对其进行了反色和黑白化处理,然后将处理后的结果保存为一个新的 BMP 文件。
阅读全文