数字图像处理基础知识总结

来源:互联网 发布:淘宝商品如何靠前 编辑:程序博客网 时间:2024/05/29 02:22

8位位图,像素读取需要unsinged char类型,因为是0-255

loadBMP 和readBMP两个函数是区别

HANDLE CdlgcallDlg::LoadBMP(LPCTSTR lpFileName){HANDLE                 hBMP;        //指向载入数据所在缓存区的句柄 HANDLE                 hFile;       BITMAPFILEHEADER     bmfHeader;   //文件头UINT                   nNumColors;  //位图颜色表的颜色数HANDLE                 hBMPtmp;     LPBITMAPINFOHEADER   lpbmInfo;    //指向信息头的指针DWORD                  dwOffBits;   //像素阵列偏移量DWORD                  dwRead;if ( ( hFile = CreateFile( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL ) ) == INVALID_HANDLE_VALUE ){return NULL;  //若打开文件失败,返回NULL}//为位图信息头和颜色表分配内存,后续可根据实际需要扩大内存hBMP = GlobalAlloc( GMEM_MOVEABLE, (DWORD)( sizeof( BITMAPINFOHEADER ) + 256*sizeof( RGBQUAD ) ) );if ( !hBMP ){CloseHandle( hFile );return NULL;}lpbmInfo = (LPBITMAPINFOHEADER)GlobalLock( hBMP );if (!lpbmInfo){goto ErrorExit_NoUnlock; }// 从文件读入位图文件头BITMAPFILEHEADERif ( !ReadFile( hFile, ( LPBYTE )&bmfHeader, sizeof( BITMAPFILEHEADER ), &dwRead, NULL ) ){goto ErrorExit;}if ( sizeof(BITMAPFILEHEADER) != dwRead ){goto ErrorExit;}// 读入位图信息头BITMAPINFOHEADERif ( !ReadFile( hFile, ( LPBYTE )lpbmInfo, sizeof( BITMAPINFOHEADER ), &dwRead, NULL ) ){goto ErrorExit;}if ( sizeof(BITMAPINFOHEADER) != dwRead ){goto ErrorExit;}//确定颜色表大小if ( !( nNumColors = ( UINT )lpbmInfo->biClrUsed ) ){if ( lpbmInfo->biBitCount != 24 )//真彩色无颜色表,否则据biBitCount计算颜色项数nNumColors = 1 << lpbmInfo->biBitCount; }if ( lpbmInfo->biClrUsed == 0 ){lpbmInfo->biClrUsed = nNumColors;}//计算像素阵列占用空间,字节对齐if ( lpbmInfo->biSizeImage == 0 )  {lpbmInfo->biSizeImage = ((((lpbmInfo->biWidth * (DWORD)lpbmInfo->biBitCount) + 31) &~31) >> 3)* lpbmInfo->biHeight;}// 重新根据实际大小分配内存,用于存放信息头、颜色表和像素阵列GlobalUnlock( hBMP );hBMPtmp = GlobalReAlloc( hBMP, lpbmInfo->biSize + nNumColors * sizeof(RGBQUAD) +  lpbmInfo->biSizeImage, 0 );  if ( !hBMPtmp ) {goto ErrorExit_NoUnlock;}else{hBMP = hBMPtmp;}lpbmInfo = ( LPBITMAPINFOHEADER )GlobalLock( hBMP );// 读入颜色表ReadFile( hFile, ( LPBYTE )(lpbmInfo) + lpbmInfo->biSize, nNumColors * sizeof( RGBQUAD ), &dwRead,NULL); //计算像素阵列偏移量dwOffBits = lpbmInfo->biSize + nNumColors * sizeof( RGBQUAD );if ( bmfHeader.bfOffBits != 0L ){SetFilePointer( hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN );}//读入位图象素数据if ( ReadFile( hFile, ( LPBYTE )lpbmInfo + dwOffBits, lpbmInfo->biSizeImage, &dwRead, NULL)){goto SuccessExit;}ErrorExit:GlobalUnlock(hBMP);ErrorExit_NoUnlock:GlobalFree(hBMP);CloseHandle( hFile );return NULL;SuccessExit:CloseHandle( hFile );GlobalUnlock(hBMP);return hBMP;}

bool CdlgcallDlg::readbmp(char *bmpname)
{
 FILE *fp=fopen(bmpname, "rb");//二进制读方式打开指定的图像文件
 
      if(fp==0)
          return 0;
 
       //跳过位图文件头结构BITMAPFILEHEADER
 
       fseek(fp, sizeof(BITMAPFILEHEADER),0);
 
       //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
  
       BITMAPINFOHEADER head; 
 
       fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息
 
      int  bmpWidth = head.biWidth;
 
    int    bmpHeight = head.biHeight;
 
     int   biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
 
       int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256
  RGBQUAD *pColorTable;
       if(biBitCount==8)
       {
   
             //申请颜色表所需要的空间,读颜色表进内存
    
             pColorTable=new RGBQUAD[256];
   
             fread(pColorTable,sizeof(RGBQUAD),256,fp);
   
         }
 
       //申请位图数据所需要的空间,读位图数据进内存
  
       pBmpBufnew=new unsigned char[lineByte * bmpHeight];
 
     fread(pBmpBufnew,1,lineByte * bmpHeight,fp);
 
     fclose(fp);//关闭文件
 
   return 1;//读取文件成功

 return true;
}

handle句柄即采用CFile来读取位图文件,及需要区别file读取文件



0 0
原创粉丝点击