Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24750
  • 博文数量: 11
  • 博客积分: 520
  • 博客等级: 中士
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-16 21:26
文章分类
文章存档

2010年(1)

2007年(10)

我的朋友

分类:

2007-04-23 20:25:56

今天写了个读取真彩色位图的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) |
给主人留下些什么吧!~~