要创建一个32位位图并将其保存为 BMP 文件,你可以按照以下步骤进行:
- 使用
CreateDIBSection
函数创建一个32位位图,并将像素数据复制到位图中。 - 使用
SetDIBitsToDevice
函数将位图绘制到设备上下文中。 - 使用
CreateFile
函数创建一个文件,并使用WriteFile
函数将位图数据写入文件中,以保存为 BMP 文件。
示例代码:
#include <Windows.h>
#include <iostream>
// 宽度和高度
const int WIDTH = 800;
const int HEIGHT = 600;
void Create32BitBitmap(unsigned int* pixels, int width, int height)
{
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height; // 像素数据是自上而下的
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
// 创建 DIB 区段
HDC hdc = GetDC(NULL);
VOID* pvBits = nullptr;
HBITMAP hBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0);
ReleaseDC(NULL, hdc);
if (hBitmap)
{
// 将像素数据复制到位图中,其中pvBits[y * height + x]代表当前XY的像素点
memcpy(pvBits, pixels, width * height * sizeof(unsigned int));
// 保存为 BMP 文件
BITMAPFILEHEADER bmfh = {0};
bmfh.bfType = 0x4D42; // "BM"
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width * height * sizeof(unsigned int);
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
HANDLE hFile = CreateFile(L"output.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD dwWritten;
WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hFile, pvBits, width * height * sizeof(unsigned int), &dwWritten, NULL);
CloseHandle(hFile);
}
// 释放位图资源
DeleteObject(hBitmap);
}
}
int main()
{
// 创建一个假设的像素数组,这里简化为全白色
unsigned int pixels[WIDTH * HEIGHT];
memset(pixels, 0xFFFFFFFF, sizeof(pixels));
// 创建 32 位位图并保存为 BMP 文件
Create32BitBitmap(pixels, WIDTH, HEIGHT);
std::cout << "Bitmap saved as output.bmp" << std::endl;
return 0;
}