读取与显示位图

 FILE *fp=fopen("lena.bmp","r");//打开文件
    if(fp==NULL){
        dc.TextOut(100,200,"no file found");
        return;
    }
    BITMAPFILEHEADER fileheader;
    BITMAPINFO info;
   
    fread(&fileheader,sizeof(fileheader),1,fp);//读取位图文件头
    if(fileheader.bfType!=0x4D42){
        dc.TextOut(100,200,"无位图文件请选择位图文件");
        fclose(fp);
        return ;
    }
    fread(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);//读取位图信息头
    long width=info.bmiHeader.biWidth;
    long height=info.bmiHeader.biHeight;
    UCHAR *buffer=new UCHAR[info.bmiHeader.biSizeImage];//位图数据大小来存放位图
    fseek(fp,fileheader.bfOffBits,0);//跳过位图信息头,fp指向位图数据位置
    fread(buffer,info.bmiHeader.biSizeImage,1,fp);//读取位图数据
    //4字节对准
    if(info.bmiHeader.biBitCount==8){
       int pitch;
        if(width%4==0){//已经对齐的
           pitch=width;
        }else{//没有对齐的
           pitch=width+4-width%4;
       }
        RGBQUAD quad[256];
        fseek(fp,fileheader.bfOffBits-sizeof(RGBQUAD)*256,0);//fp指向颜色表
        fread(quad,sizeof(RGBQUAD)*256,1,fp);//读取颜色表
        if(height>0){
           //height>0 表示图片颠倒
           for(int i=0;i<height;i++){
               for(int j=0;j<width;j++){
                  int index=buffer[i*pitch+j];//索引
                  UCHAR r=quad[index].rgbRed;
                  UCHAR g=quad[index].rgbGreen;
                  UCHAR b=quad[index].rgbBlue;
                   dc.SetPixel(j,height-i,RGB(r,g,b));
               }
           }
        }else{
           for(int i=0;i<0-height;i++){
               for(int j=0;j<width;j++){
                  int index=buffer[i*pitch+j];
                  UCHAR r=quad[index].rgbRed;
                  UCHAR g=quad[index].rgbGreen;
                  UCHAR b=quad[index].rgbBlue;
                  dc.SetPixel(j,i,RGB(r,g,b));
               }
           }
        }
    }//if
else if(info.bmiHeader.biBitCount==16){
       int pitch=width+width%2;
        if(height>0){
           //height>0 表示图片颠倒
           if(info.bmiHeader.biCompression==BI_RGB){
               //该模式只有555(无压缩)
               for(int i=0;i<height;i++){
                   for(int j=0;j<width;j++){         
                      //5 5 5 格式
                      UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                      UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5);
                      UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
                      dc.SetPixel(j,height-i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xFF)/0x1F));
                  }
               }
           }else if(info.bmiHeader.biCompression==BI_BITFIELDS){
               //该模式在bitmapinfoheader之后存在RGB掩码 每个掩码1 DWORD
               fseek(fp,fileheader.bfOffBits-sizeof(DWORD )*3,0);
               DWORD  rMask;
               fread(&rMask,sizeof(DWORD ),1,fp);
               if(rMask==0x7C00){
                  // 5 5 5 格式
                   MessageBeep(0);
                   for(int i=0;i<height;i++){
                      for(int j=0;j<width;j++){
                          UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                          UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5);
                          UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
                          dc.SetPixel(j,height-i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xFF)/0x1F));
                      }
                   }
               }else if(rMask==0xF800){
                  //5 6 5 格式
                   for(int i=0;i<height;i++){
                      for(int j=0;j<width;j++){
                          UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                          UCHAR g=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5);
                          UCHAR r=buffer[(i*pitch+j)*2+1]>>3;
                          dc.SetPixel(j,height-i,RGB(r*0xFF/0x1F,g*0xFF/0x3F,b*0xFF/0x1F));
                      }
                  }
               }
           }
        }else{
           if(info.bmiHeader.biCompression==BI_RGB){
               //该模式只有555
               for(int i=0;i<0-height;i++){
                   for(int j=0;j<width;j++){         
                      //5 5 5 格式
                      UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                      UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5);
                      UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
                     dc.SetPixel(j,i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xFF)/0x1F));
                  }
               }
           }else if(info.bmiHeader.biCompression==BI_BITFIELDS){
               //该模式在bitmapinfoheader之后存在RGB掩码 每个掩码1 DWORD
               fseek(fp,fileheader.bfOffBits-sizeof(DWORD )*3,0);
               DWORD  rMask;
               fread(&rMask,sizeof(DWORD ),1,fp);
               if(rMask==0x7C00){
                  // 5 5 5 格式
                   MessageBeep(0);
                   for(int i=0;i<0-height;i++){
                      for(int j=0;j<width;j++){
                          UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                          UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5);
                          UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
                          dc.SetPixel(j,i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xFF)/0x1F));
                      }
                  }
               }else if(rMask==0xF800){
                  //5 6 5 格式
                   for(int i=0;i<0-height;i++){
                      for(int j=0;j<width;j++){
                          UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
                          UCHAR g=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5);
                          UCHAR r=buffer[(i*pitch+j)*2+1]>>3;
                          dc.SetPixel(j,i,RGB(r*0xFF/0x1F,g*0xFF/0x3F,b*0xFF/0x1F));
                      }
                  }
               }
           }
       }
        //pDC->TextOut(100,200,"16位图");
    }else if(info.bmiHeader.biBitCount==24){
       int pitch=width%4;
       //b g r
        if(height>0){
           //height>0 表示图片颠倒
           for(int i=0;i<height;i++){
               int realPitch=i*pitch;
               for(int j=0;j<width;j++){                
                  UCHAR b=buffer[(i*width+j)*3+realPitch];
                  UCHAR g=buffer[(i*width+j)*3+1+realPitch];
                  UCHAR r=buffer[(i*width+j)*3+2+realPitch];
                   dc.SetPixel(j,height-i,RGB(r,g,b));
               }
           }
        }else{
           for(int i=0;i<0-height;i++){
               int realPitch=i*pitch;
               for(int j=0;j<width;j++){
                  UCHAR b=buffer[(i*width+j)*3+realPitch];
                  UCHAR g=buffer[(i*width+j)*3+1+realPitch];
                  UCHAR r=buffer[(i*width+j)*3+2+realPitch];
                   dc.SetPixel(j,i,RGB(r,g,b));
               }
           }
       }
      
        //pDC->TextOut(100,200,"24位图");
 
    }else if(info.bmiHeader.biBitCount==32){
       // b g r a
        if(height>0){
           //height>0 表示图片颠倒
           for(int i=0;i<0-height;i++){
               for(int j=0;j<width;j++){
                  UCHAR b=buffer[(i*width+j)*4];
                  UCHAR g=buffer[(i*width+j)*4+1];
                  UCHAR r=buffer[(i*width+j)*4+2];
                   dc.SetPixel(j,height-i,RGB(r,g,b));
               }
           }
        }else{
           for(int i=0;i<height;i++){
               for(int j=0;j<width;j++){
                  UCHAR b=buffer[(i*width+j)*4];
                  UCHAR g=buffer[(i*width+j)*4+1];
                  UCHAR r=buffer[(i*width+j)*4+2];
                   dc.SetPixel(j,i,RGB(r,g,b));
               }
           }
       }
        //pDC->TextOut(100,200,"32位图");
    }
    delete buffer;
    fclose(fp);

*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值