用c语言实现一个对一个BMP灰度图片文件读取,将它保存到一个二维数组里面
时间: 2023-05-29 08:02:26 浏览: 278
读取bmp位图,并转换为灰度图像 C语言
5星 · 资源好评率100%
#include <stdio.h>
#include <stdlib.h>
// 定义BMP文件头结构体
typedef struct {
unsigned short bfType; // BMP文件类型,必须是0x424D,即字符“BM”
unsigned int bfSize; // BMP文件大小
unsigned short bfReserved1; // 保留字段1
unsigned short bfReserved2; // 保留字段2
unsigned int bfOffBits; // BMP文件数据偏移量,即文件头+位图信息头大小
} __attribute__((packed)) BMPFileHeader;
// 定义BMP位图信息头结构体
typedef struct {
unsigned int biSize; // 位图信息头大小,即40字节
int biWidth; // 位图宽度
int biHeight; // 位图高度,正数表示正向,负数表示倒置
unsigned short biPlanes; // 总是为1
unsigned short biBitCount; // 位图颜色位数,即每个像素占用位数
unsigned int biCompression; // 采用的压缩方法,0为不压缩
unsigned int biSizeImage; // 数据区大小,0表示没有压缩
int biXPelsPerMeter; // 水平分辨率
int biYPelsPerMeter; // 垂直分辨率
unsigned int biClrUsed; // 颜色表中实际使用的颜色数,0表示使用全部颜色
unsigned int biClrImportant;// 针对重要的颜色数,0表示所有颜色都重要
} __attribute__((packed)) BMPInfoHeader;
int main() {
// 打开BMP文件
FILE *fp = fopen("test.bmp", "rb");
if (fp == NULL) {
printf("Failed to open file!\n");
exit(1);
}
// 读取BMP文件头
BMPFileHeader bmpFileHeader;
fread(&bmpFileHeader, sizeof(BMPFileHeader), 1, fp);
// 判断是否为BMP文件
if (bmpFileHeader.bfType != 0x4D42) {
printf("This is not a BMP file!\n");
fclose(fp);
exit(2);
}
// 读取BMP位图信息头
BMPInfoHeader bmpInfoHeader;
fread(&bmpInfoHeader, sizeof(BMPInfoHeader), 1, fp);
// 判断是否为灰度图像
if (bmpInfoHeader.biBitCount != 8) {
printf("This is not a grayscale BMP file!\n");
fclose(fp);
exit(3);
}
// 读取颜色表
unsigned char colorTable[1024];
fread(colorTable, sizeof(unsigned char), 1024, fp);
// 分配二维数组存储图像数据
unsigned char **imageData = (unsigned char **)malloc(bmpInfoHeader.biHeight * sizeof(unsigned char *));
for (int i = 0; i < bmpInfoHeader.biHeight; i++) {
imageData[i] = (unsigned char *)malloc(bmpInfoHeader.biWidth * sizeof(unsigned char));
fread(&imageData[i][0], sizeof(unsigned char), bmpInfoHeader.biWidth, fp);
}
// 关闭文件
fclose(fp);
// 输出图像数据
for (int i = 0; i < bmpInfoHeader.biHeight; i++) {
for (int j = 0; j < bmpInfoHeader.biWidth; j++) {
printf("%d ", imageData[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < bmpInfoHeader.biHeight; i++) {
free(imageData[i]);
}
free(imageData);
return 0;
}
阅读全文