|
bmp ReadBmp(char *bmpName)
{
bmp m; // 定义一个位图结构
FILE *fp;
unsigned char *BmpBuf;
int i;
int bmpWidth; // 图像的宽
int bmpHeight; // 图像的高
int biBitCount; // 图像类型,每像素位数
int lineByte;
if((fp=fopen( bmpName, "rb"))==NULL)
{
printf( "can't open the bmp imgae.\n ");
exit(0);
}
else
{
fread(&m.file.bfType, sizeof(char), 2, fp); // 类型
fread(&m.file.bfSize, sizeof(int), 1, fp); // 文件长度
fread(&m.file.bfReserverd1, sizeof(short int), 1, fp); // 保留字 1
fread(&m.file.bfReserverd2, sizeof(short int), 1, fp); // 保留字 2
fread(&m.file.bfbfOffBits, sizeof(int), 1, fp); // 偏移量
fread(&m.info.biSize, sizeof(int), 1, fp); // 此结构大小
fread(&m.info.biWidth, sizeof(int), 1, fp); // 位图的宽度
fread(&m.info.biHeight, sizeof(int), 1, fp); // 位图的高度
fread(&m.info.biPlanes, sizeof(short), 1, fp); // 目标设备位图数
fread(&m.info.biBitcount, sizeof(short) ,1, fp); // 颜色深度
fread(&m.info.biCompression, sizeof(int), 1, fp); // 位图压缩类型
fread(&m.info.biSizeImage, sizeof(int), 1, fp); // 位图大小
fread(&m.info.biXPelsPermeter, sizeof(int), 1, fp); // 位图水平分辨率
fread(&m.info.biYPelsPermeter, sizeof(int), 1, fp); // 位图垂直分辨率
fread(&m.info.biClrUsed, sizeof(int), 1, fp); // 位图实际使用颜色数
fread(&m.info.biClrImportant, sizeof(int), 1, fp); // 位图显示中比较重要颜色数
}
// 获取图像宽、高、每像素所占位数等信息
bmpWidth = m.info.biWidth;
bmpHeight = m.info.biHeight;
biBitCount = m.info.biBitcount;
// 定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
lineByte = (bmpWidth*biBitCount/8+3)/4*4;
// 灰度图像有颜色表,且颜色表表项为256
if(biBitCount == 8)
{
// 分配内存空间
m.pColorTable = (RGBQUAD *)malloc(256*4);
// 申请颜色表所需要的空间,读颜色表进内存
fread(m.pColorTable, sizeof(RGBQUAD), 256, fp);
}
// 分配内存空间
m.imgBuf = (unsigned char *)malloc(m.info.biSizeImage);
BmpBuf = (unsigned char *)malloc(m.info.biSizeImage);
// 读位图数据
fread(BmpBuf, lineByte * bmpHeight, 1, fp);
// 将读到的数据垂直镜像翻转
for(i = 0; i < bmpHeight; i++)
memcpy((void *)(m.imgBuf + lineByte * i),
(void *)(BmpBuf + lineByte * (bmpHeight - i - 1)), lineByte);
// 关闭文件
fclose(fp);
return m;
}
如果我想读取一个颜色深度为24的bmp图像(程序针对颜色深度为8),应该如何修改程序中的设置。。
|
|