画一个255灰阶图片保存为bmp
时间: 2024-03-06 15:46:16 浏览: 137
以下是用 C++ 实现在 Windows 环境下绘制一个 255 灰阶图片并保存为 BMP 格式的代码:
```cpp
#include <Windows.h>
#include <fstream>
#pragma pack(push, 2) // 设置 BMP 文件头的结构体字节对齐为 2
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
#pragma pack(pop)
int main() {
const int width = 256;
const int height = 256;
const int bpp = 8; // 8 位灰度图
// 创建 BMP 文件头
BITMAPFILEHEADER fileHeader = {};
fileHeader.bfType = 0x4D42;
fileHeader.bfSize = sizeof(fileHeader) + sizeof(BITMAPINFOHEADER) + width * height * bpp / 8;
fileHeader.bfOffBits = sizeof(fileHeader) + sizeof(BITMAPINFOHEADER);
// 创建 BMP 信息头
BITMAPINFOHEADER infoHeader = {};
infoHeader.biSize = sizeof(infoHeader);
infoHeader.biWidth = width;
infoHeader.biHeight = height;
infoHeader.biPlanes = 1;
infoHeader.biBitCount = bpp;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = 0;
infoHeader.biXPelsPerMeter = 2835; // 设置水平分辨率为 72dpi
infoHeader.biYPelsPerMeter = 2835; // 设置垂直分辨率为 72dpi
// 创建像素数据
BYTE* pixels = new BYTE[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pixels[y * width + x] = x;
}
}
// 将 BMP 文件头和 BMP 信息头写入文件
std::ofstream file("test.bmp", std::ios::binary | std::ios::trunc);
if (file) {
file.write(reinterpret_cast<const char*>(&fileHeader), sizeof(fileHeader));
file.write(reinterpret_cast<const char*>(&infoHeader), sizeof(infoHeader));
// 写入像素数据
for (int y = height - 1; y >= 0; y--) { // BMP 格式要求像素数据从下到上保存
file.write(reinterpret_cast<const char*>(pixels + y * width), width);
}
file.close();
}
delete[] pixels;
return 0;
}
```
这段代码创建了一个 `256x256` 的 8 位灰度图,每个像素的值从 `0` 到 `255`,并将其保存为 BMP 格式的文件。可以通过修改像素数据的生成方式来实现其他类型的灰度图。
阅读全文