46 lines
1.7 KiB
C++
46 lines
1.7 KiB
C++
#include "bmp.hpp"
|
||
|
||
#include <fstream>
|
||
#include <iostream>
|
||
|
||
// 将RGB24格式像素数据封装为BMP图像
|
||
bool write_bmp(const char* filename, uint8_t* data, int32_t width,
|
||
int32_t height) {
|
||
BMPFileHeader file_header = {0};
|
||
BMPInfoHeader info_header = {0};
|
||
std::ofstream ofs(filename, std::ios::binary);
|
||
if (!ofs) {
|
||
std::cerr << "Failed to create file: " << filename << std::endl;
|
||
return false;
|
||
}
|
||
// BMP文件头
|
||
file_header.type = 0x4D42; // BM
|
||
file_header.size =
|
||
sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + width * height * 3;
|
||
file_header.offset = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader);
|
||
ofs.write(reinterpret_cast<char*>(&file_header), sizeof(file_header));
|
||
|
||
// BMP位图信息头
|
||
info_header.size = sizeof(BMPInfoHeader);
|
||
info_header.width = width;
|
||
info_header.height = height;
|
||
info_header.planes = 1;
|
||
info_header.bit_count = 24;
|
||
info_header.size_image = width * height * 3;
|
||
ofs.write(reinterpret_cast<char*>(&info_header), sizeof(info_header));
|
||
|
||
// 像素数据
|
||
int32_t row_size = (((width + 1) * 3) / 4) * 4; // 行字节数,必须为4的倍数
|
||
uint8_t* row_data = new uint8_t[row_size];
|
||
for (int32_t y = height - 1; y >= 0; --y) { // BMP图像的行是从下往上存储的
|
||
for (int32_t x = 0; x < width; ++x) {
|
||
row_data[x * 3 + 2] = data[(y * width + x) * 3 + 0]; // B
|
||
row_data[x * 3 + 1] = data[(y * width + x) * 3 + 1]; // G
|
||
row_data[x * 3 + 0] = data[(y * width + x) * 3 + 2]; // R
|
||
}
|
||
ofs.write(reinterpret_cast<char*>(row_data), row_size);
|
||
}
|
||
delete[] row_data;
|
||
ofs.close();
|
||
return true;
|
||
} |