求一个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; }

详细说明:

  1. BMPHeader 结构体:这个结构体定义了BMP文件头的格式,它包含了BMP文件的基本信息,包括图像宽度、高度、像素位数等。

  2. bmpToRaw 函数

    • 打开BMP文件:使用 fopen 打开BMP文件,读取文件头信息到 BMPHeader 结构体中。
    • 验证文件类型和位深度:检查文件类型是否为BMP (bfType == 0x4D42),并且仅支持24位色深度 (biBitCount == 24)。
    • 创建RAW文件:使用 fopen 创建输出的RAW文件。
    • 像素数据处理:根据BMP文件头信息,偏移到像素数据的位置 (bfOffBits),然后逐行读取像素数据(每个像素3字节,BGR顺序),写入到RAW文件中。
    • 关闭文件:最后关闭所有打开的文件,释放动态分配的内存。
  3. main 函数

    • main 函数中,定义了输入的BMP文件名和输出的RAW文件名,并调用 bmpToRaw 函数进行转换。

这个程序能够简单地将24位色的BMP图像文件转换为RAW格式,适合于学习和基本应用。在实际应用中,可能需要更复杂的错误处理和更多的BMP格式支持。