今天写了个读取真彩色位图的c程序,因为一错误查了不少时间,最后发现是由于打开图像文件是不是以二进制格式打开造成的(误用了r,应该是rb方式fopen),特写此文以示教训。
文本方式和二进制方式的最大区别在于文本方式对于'\n'换行符的理解不同,在DOS平台下,该字符会被展开成< LF>两个控制字符(相当于"\r\n"),在ASCII字符集下是0DH,0AH,而在UNIX平台下,仅仅是,不会展开。而在二进制方式下,不管是什么平台,'\n'都是精确的。
#include
#include
#include
#define sourcebitmap "f:\\本科毕业设计 design\\debug\\horse.bmp"
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
typedef unsigned char BYTE ;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct MYIMAGE{
BYTE blue;
BYTE green;
BYTE red;
}MYImage;
int main(){
int biWidth_4;
long int biImageSize;
MYImage *MyImage;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
int i,j;
/*打开bmp文件,获取文件指针*/
FILE *fp;
if((fp=fopen(sourcebitmap, "rb")) == NULL){
printf("cann't open %s\n",sourcebitmap);
}
/*fseek(fp,0L,SEEK_SET);*/
fread(&bmfHeader.bfType,sizeof(WORD),1,fp);
fread(&bmfHeader.bfSize,sizeof(DWORD),1,fp);
fread(&bmfHeader. bfReserved1,sizeof(WORD),1,fp);
fread(&bmfHeader. bfReserved2,sizeof(WORD),1,fp);
fread(&bmfHeader.bfOffBits,sizeof(DWORD),1,fp);
/*检查头两个字节是否是"BM"*/
if (bmfHeader.bfType!=0x4D42){
printf("这不是一个位图文件\n");
exit(0);
}
fread(&bmiHeader.biSize,sizeof(DWORD),1,fp);
fread(&bmiHeader.biWidth,sizeof(long),1,fp);
fread(&bmiHeader. biHeight,sizeof(long),1,fp);
fread(&bmiHeader. biPlanes,sizeof(WORD),1,fp);
fread(&bmiHeader.biBitCount,sizeof(WORD),1,fp);
fread(&bmiHeader.biCompression,sizeof(DWORD),1,fp);
fread(&bmiHeader.biSizeImage,sizeof(DWORD),1,fp);
fread(&bmiHeader.biXPelsPerMeter,sizeof(long),1,fp);
fread(&bmiHeader.biYPelsPerMeter,sizeof(long),1,fp);
fread(&bmiHeader.biClrUsed,sizeof(DWORD),1,fp);
fread(&bmiHeader.biClrImportant,sizeof(DWORD),1,fp);
switch(bmiHeader.biBitCount){
case 8:
printf("图片是256色位图文件!\n");
break;
case 24:
printf("图片是真彩色位图文件!\n");
break;
default:
printf("图片是其他色位图文件!\n");
}
/*allocating memory for bitmap pixels information*/
biWidth_4 = (bmiHeader.biWidth + 3)/4*4;
biImageSize = biWidth_4 * bmiHeader.biHeight;
if((MyImage = (MYImage *)malloc(biImageSize * sizeof(MYImage))) == (MYImage *)NULL){
printf("Failed to allocate memory\n");
}
/*令文件指针指向位图有效数据的起始位置*/
fseek(fp, bmfHeader.bfOffBits, 0);
for(i=0; i for(j=0;j //在位图存储中,RGB的存储顺序是BGR
fread(&((MyImage+i*biWidth_4)+j)->blue,sizeof(BYTE), 1, fp);
fread(&(((MyImage+i*biWidth_4)+j)->green),sizeof(BYTE), 1, fp);
fread(&(((MyImage+i*biWidth_4)+j)->red),sizeof(BYTE), 1, fp);
}
}
//输出MyImage二维数组的结果
printf("\n");
printf("Print the effective data!\n");
for(i=0; i for(j=0; j printf("%d ",((MyImage+i*biWidth_4)+j)->blue);
printf("%d ",((MyImage+i*biWidth_4)+j)->green);
printf("%d ",((MyImage+i*biWidth_4)+j)->red);
printf(" @@ ");
}
}
fclose(fp);
}
阅读(605) | 评论(0) | 转发(0) |