C语言读入bmp图像

1.bmp图像数据格式

BMP(Bitmap)是一种常见的图像文件格式,它以二进制形式存储图像数据。以下是BMP图像的基本数据格式:

1. BMP文件头(14字节):

  •    文件类型(2字节):通常为"BM",用于标识文件格式。
  •    文件大小(4字节):以字节为单位,表示整个BMP文件的大小。
  •     保留字段1(2字节):保留字段,通常设置为0。
  •    保留字段2(2字节):保留字段,通常设置为0。
  •    数据偏移量(4字节):图像数据相对于文件起始位置的偏移量。

2. BMP信息头(40字节):

  •    信息头大小(4字节):一般为40,表示信息头的大小。
  •     图像宽度(4字节):以像素为单位,表示图像的宽度。
  •    图像高度(4字节):以像素为单位,表示图像的高度。如果为正值,图像是正向的(从上到下),如果为负值,图像是反向的(从下到上)。
  •     颜色平面数(2字节):总是1。
  •     每像素位数(2字节):表示每个像素使用的位数,一般为24(真彩色)。
  •     压缩方式(4字节):通常为0,表示不压缩。
  •     图像数据大小(4字节):以字节为单位,表示图像数据的大小。
  •     水平分辨率(4字节):以像素每米为单位,通常为0。
  •     垂直分辨率(4字节):以像素每米为单位,通常为0。
  •     使用的颜色数(4字节):通常为0,表示使用所有可能的颜色。
  •     重要的颜色数(4字节):通常为0,表示所有颜色都是重要的。

3. 颜色表(可选,如果使用调色板的话):
   - 颜色表包含了颜色的定义,通常用于8位或更低位深度的图像。

4. 图像数据:
   - 图像数据以行为单位存储,每一行的字节数可能会被填充以保证是4的倍数。

对于24位真彩色的BMP图像,图像数据部分以蓝色、绿色和红色的顺序依次表示一个像素的颜色,每个颜色通道占用1字节。

请注意,实际的BMP文件可能会包含其他一些附加信息或者使用不同的配置,但上述是BMP文件中最基本和常见的部分。

2.C语言读入数据

#include 
#include 

// 定义BMP文件头结构
#pragma pack(2)
typedef struct {
    unsigned short type;      // 文件类型,固定为0x4D42('BM')
    unsigned int size;        // 文件大小
    unsigned short reserved1; // 保留字段1
    unsigned short reserved2; // 保留字段2
    unsigned int offset;      // 数据偏移量
} BMPHeader;
#pragma pack()

// 定义BMP信息头结构
#pragma pack(2)
typedef struct {
    unsigned int size;         // 信息头大小,固定为40
    int width;                 // 图像宽度
    int height;                // 图像高度
    unsigned short planes;     // 颜色平面数,固定为1
    unsigned short bitCount;   // 每像素位数,一般为24
    unsigned int compression;  // 压缩方式,一般为0
    unsigned int imageSize;    // 图像数据大小
    int xPelsPerMeter;         // 水平分辨率
    int yPelsPerMeter;         // 垂直分辨率
    unsigned int clrUsed;      // 使用的颜色数
    unsigned int clrImportant; // 重要的颜色数
} BMPInfoHeader;
#pragma pack()

// 函数用于读取BMP文件头
void readBMPHeader(FILE *file, BMPHeader *header) {
    fread(header, sizeof(BMPHeader), 1, file);
}

// 函数用于读取BMP信息头
void readBMPInfoHeader(FILE *file, BMPInfoHeader *infoHeader) {
    fread(infoHeader, sizeof(BMPInfoHeader), 1, file);
}

int main() {
    // 打开BMP文件
    FILE *file = fopen("example.bmp", "rb");

    if (!file) {
        perror("Failed to open file");
        return 1;
    }

    BMPHeader header;
    BMPInfoHeader infoHeader;

    // 读取BMP文件头和信息头
    readBMPHeader(file, &header);
    readBMPInfoHeader(file, &infoHeader);

    printf("Width: %d\n", infoHeader.width);
    printf("Height: %d\n", infoHeader.height);

    // 计算每行像素的字节数
    int padding = (4 - (infoHeader.width * 3) % 4) % 4;
    int rowSize = infoHeader.width * 3 + padding;

    // 分配存储像素数据的内存
    unsigned char *data = (unsigned char *)malloc(rowSize * infoHeader.height);

    // 读取像素数据
    fread(data, rowSize * infoHeader.height, 1, file);

    // 在这里可以对像素数据进行处理

    // 释放内存并关闭文件
    free(data);
    fclose(file);

    return 0;
}

这个代码打开一个名为example.bmp的文件,并读取了BMP文件头和信息头。接着,它计算了每行像素的字节数,并分配了足够的内存来存储所有的像素数据。最后,它使用fread函数将像素数据读取到内存中。

你可能感兴趣的:(计算机视觉,c语言)