用C++语言写一个将内存的16位像素数据保存为bmp文件.
时间: 2024-05-20 14:16:31 浏览: 97
BMP.zip_C++源码_C++读入bmp_打开保存BMP文件
以下是一个可能的实现,仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
// BMP文件头结构体
#pragma pack(push, 1)
typedef struct {
WORD bfType; // 文件类型,必须为0x4D42
DWORD bfSize; // 文件大小
WORD bfReserved1; // 保留字段
WORD bfReserved2; // 保留字段
DWORD bfOffBits; // bmp数据的偏移量
} BMPFILEHEADER;
#pragma pack(pop)
// BMP信息头结构体
#pragma pack(push, 1)
typedef struct {
DWORD biSize; // 信息头大小,必须为40
DWORD biWidth; // 图像宽度,单位像素
DWORD biHeight; // 图像高度,单位像素
WORD biPlanes; // 颜色平面数,必须为1
WORD biBitCount; // 每个像素的位数
DWORD biCompression; // 压缩类型
DWORD biSizeImage; // bmp数据大小
DWORD biXPelsPerMeter; // 水平分辨率,像素/米
DWORD biYPelsPerMeter; // 垂直分辨率,像素/米
DWORD biClrUsed; // 使用的颜色表中的颜色数
DWORD biClrImportant; // 重要的颜色数
} BMPINFOHEADER;
#pragma pack(pop)
// 将内存中的像素数据保存为bmp文件
void save_bmp(const char* filename, BYTE* pixels, int width, int height) {
// 计算bmp文件大小和bmp数据大小
int row_size = (width * 2 + 3) & ~3; // 每行的字节数必须是4的倍数
int data_size = row_size * height;
int file_size = sizeof(BMPFILEHEADER) + sizeof(BMPINFOHEADER) + data_size;
// 构造bmp文件头
BMPFILEHEADER file_header = {0};
file_header.bfType = 0x4D42;
file_header.bfSize = file_size;
file_header.bfOffBits = sizeof(BMPFILEHEADER) + sizeof(BMPINFOHEADER);
// 构造bmp信息头
BMPINFOHEADER info_header = {0};
info_header.biSize = sizeof(BMPINFOHEADER);
info_header.biWidth = width;
info_header.biHeight = height;
info_header.biPlanes = 1;
info_header.biBitCount = 16;
info_header.biCompression = 0;
info_header.biSizeImage = data_size;
info_header.biXPelsPerMeter = 0;
info_header.biYPelsPerMeter = 0;
info_header.biClrUsed = 0;
info_header.biClrImportant = 0;
// 打开文件并写入bmp文件头和bmp信息头
FILE* fp = fopen(filename, "wb");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
fwrite(&file_header, sizeof(BMPFILEHEADER), 1, fp);
fwrite(&info_header, sizeof(BMPINFOHEADER), 1, fp);
// 写入像素数据
BYTE* row_buf = (BYTE*)malloc(row_size);
memset(row_buf, 0, row_size); // 每行填充0补齐
for (int y = height - 1; y >= 0; y--) {
// 将每一行的像素数据转换为16位RGB565格式并写入文件
BYTE* src = pixels + y * width * 2;
WORD* dst = (WORD*)row_buf;
for (int x = 0; x < width; x++) {
BYTE r = src[0];
BYTE g = src[1];
BYTE b = src[2];
*dst++ = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
src += 2;
}
fwrite(row_buf, row_size, 1, fp);
}
free(row_buf);
// 关闭文件
fclose(fp);
}
int main() {
// 示例代码,假设内存中有一个16位RGB565格式的像素数组
int width = 320;
int height = 240;
BYTE* pixels = (BYTE*)malloc(width * height * 2);
memset(pixels, 0, width * height * 2);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int i = y * width + x;
pixels[i * 2] = (x * 255) / width;
pixels[i * 2 + 1] = (y * 255) / height;
}
}
save_bmp("test.bmp", pixels, width, height);
free(pixels);
return 0;
}
阅读全文