求一个bmp转raw的C语言程序 需要完整的
将BMP图像文件转换为RAW格式的C语言程序涉及几个基本步骤:读取BMP文件头信息、读取像素数据并进行格式转换、写入RAW文件。以下是一个简单的示例程序,演示了如何实现这一过程。
c#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#pragma pack(push, 1) // 禁止结构体字节对齐
typedef struct {
uint16_t bfType; // 文件类型,必须是0x4D42('BM')
uint32_t bfSize; // 文件大小,字节为单位
uint16_t bfReserved1; // 保留,必须为0
uint16_t bfReserved2; // 保留,必须为0
uint32_t bfOffBits; // 从文件头到像素数据的偏移量
uint32_t biSize; // BITMAPINFOHEADER 结构的大小
int32_t biWidth; // 图像的宽度,像素为单位
int32_t biHeight; // 图像的高度,像素为单位
uint16_t biPlanes; // 色彩平面数,必须是1
uint16_t biBitCount; // 每个像素的位数
uint32_t biCompression; // 压缩类型,0表示不压缩
uint32_t biSizeImage; // 图像大小,字节为单位,可以是0
int32_t biXPelsPerMeter; // 水平分辨率,像素每米
int32_t biYPelsPerMeter; // 垂直分辨率,像素每米
uint32_t biClrUsed; // 使用的颜色索引数,0表示使用所有的颜色索引
uint32_t biClrImportant; // 对图像显示有重要影响的颜色索引的数量,0表示所有都是重要的
} BMPHeader;
#pragma pack(pop)
void bmpToRaw(const char *bmpFile, const char *rawFile) {
FILE *fpBmp = fopen(bmpFile, "rb");
if (!fpBmp) {
perror("Failed to open BMP file");
return;
}
BMPHeader header;
fread(&header, sizeof(BMPHeader), 1, fpBmp);
if (header.bfType != 0x4D42) {
fclose(fpBmp);
fprintf(stderr, "Not a BMP file\n");
return;
}
if (header.biBitCount != 24) {
fclose(fpBmp);
fprintf(stderr, "Only 24-bit BMP supported\n");
return;
}
FILE *fpRaw = fopen(rawFile, "wb");
if (!fpRaw) {
fclose(fpBmp);
perror("Failed to create RAW file");
return;
}
// 偏移到像素数据开始处
fseek(fpBmp, header.bfOffBits, SEEK_SET);
// BMP中每行像素数据的字节数(每个像素3字节)
int rowSize = header.biWidth * 3;
// 读取并写入像素数据(BGR顺序)
unsigned char *buffer = (unsigned char *)malloc(rowSize);
for (int y = 0; y < header.biHeight; ++y) {
fread(buffer, 1, rowSize, fpBmp);
fwrite(buffer, 1, rowSize, fpRaw);
}
free(buffer);
fclose(fpBmp);
fclose(fpRaw);
printf("BMP to RAW conversion successful.\n");
}
int main() {
const char *bmpFile = "input.bmp";
const char *rawFile = "output.raw";
bmpToRaw(bmpFile, rawFile);
return 0;
}
详细说明:
BMPHeader 结构体:这个结构体定义了BMP文件头的格式,它包含了BMP文件的基本信息,包括图像宽度、高度、像素位数等。
bmpToRaw 函数:
- 打开BMP文件:使用
fopen
打开BMP文件,读取文件头信息到BMPHeader
结构体中。 - 验证文件类型和位深度:检查文件类型是否为BMP (
bfType == 0x4D42
),并且仅支持24位色深度 (biBitCount == 24
)。 - 创建RAW文件:使用
fopen
创建输出的RAW文件。 - 像素数据处理:根据BMP文件头信息,偏移到像素数据的位置 (
bfOffBits
),然后逐行读取像素数据(每个像素3字节,BGR顺序),写入到RAW文件中。 - 关闭文件:最后关闭所有打开的文件,释放动态分配的内存。
- 打开BMP文件:使用
main 函数:
- 在
main
函数中,定义了输入的BMP文件名和输出的RAW文件名,并调用bmpToRaw
函数进行转换。
- 在
这个程序能够简单地将24位色的BMP图像文件转换为RAW格式,适合于学习和基本应用。在实际应用中,可能需要更复杂的错误处理和更多的BMP格式支持。