win32圖像的讀操作

Code:
  1.   
  2. //  文件路徑:lpszPathName,  指向DIB位圖的指針     
  3. BOOL ReadImge(LPCTSTR lpszPathName, LPBYTE lpByte)   
  4. {   
  5.            
  6.     LPBYTE lpDib;// DIB的指針   
  7.     HANDLE hFile;// 文件句柄   
  8.     HPALETTE hPalette;// 邏輯調色板句柄   
  9.     int nColorTableLength;// 顏色表長度   
  10.   
  11.     int imgWidth;// 圖像的寬度   
  12.     int imgHeight;// 圖像的高度   
  13.     int nBitCount;// 每個像素點的位數   
  14.     unsigned char* pImgData;// 圖像數據   
  15.     LPBITMAPINFOHEADER lpBmpInfoHead;// 圖像信息頭指針   
  16.         LPRGBQUAD lpColorTable; // 圖像顏色表   
  17.        
  18.   
  19.     // 以只讀的方式打開一個文件   
  20.     hFile = CreateFile(lpszPathName, GENERIC_READ, FILE_SHARE_READ, NULL,   
  21.         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   
  22.   
  23.     // 打開文件失敗   
  24.     if (INVALID_HANDLE_VALUE == hFile)   
  25.         return FALSE;   
  26.        
  27.     // 文件頭結構   
  28.     BITMAPFILEHEADER bmfn;   
  29.     DWORD dwRead;   
  30.        
  31.     // 讀入數據到文件頭   
  32.     if (FALSE == ReadFile(hFile, (LPVOID)&bmfn, sizeof(BITMAPFILEHEADER), &dwRead, NULL))   
  33.         return FALSE;   
  34.        
  35.     // 讀取文件的大小   
  36.     DWORD dwFileSize;   
  37.     dwFileSize = GetFileSize(hFile, NULL);   
  38.     printf("%d", dwFileSize);   
  39.     // 分配內存大小   
  40.     lpDib = new BYTE[dwFileSize - sizeof(BITMAPFILEHEADER)];   
  41.        
  42.     // 讀入數據到內存   
  43.     if (FALSE == ReadFile(hFile, lpDib, dwFileSize - sizeof(BITMAPFILEHEADER), &dwRead, NULL))   
  44.         return FALSE;   
  45.   
  46.     // 指針類型轉換   
  47.     lpBmpInfoHead = (LPBITMAPINFOHEADER)lpDib;   
  48.   
  49.     //圖像的寬度   
  50.     imgWidth = lpBmpInfoHead->biWidth;   
  51.   
  52.     // 圖像的高度   
  53.     imgHeight = lpBmpInfoHead->biHeight;   
  54.   
  55.     // 每個像素佔得位數   
  56.     nBitCount = lpBmpInfoHead->biBitCount;   
  57.        
  58.     // 計算顏色表的長度   
  59.     nColorTableLength = ComputeColorTableLength(nBitCount);   
  60.   
  61.     // 邏輯調色板句柄   
  62.     hPalette = NULL;   
  63.   
  64.     // 顏色表長度不爲0表示圖像不是真彩色,要使用調色板   
  65.     if (nColorTableLength != 0)   
  66.     {   
  67.         // 圖像=位圖文件頭+位圖信息頭+調色板數據+像素數據   
  68.         // image = BITMAPFILEHEADER + BITMAPINFOHEADER + RGBQUAD + IMAGEDATA   
  69.         // 指向調色板數據指針   
  70.         lpColorTable = (LPRGBQUAD)(lpDib + sizeof(BITMAPINFOHEADER));   
  71.            
  72.   
  73.         // 創建邏輯調色板   
  74.         MakePalette(nColorTableLength, lpColorTable, hPalette);   
  75.         //memcpy(lpColor, lpColorTable, sizeof(RGBQUAD));   
  76.     }   
  77.   
  78.     // 圖像數據   
  79.     pImgData = (LPBYTE)lpDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nColorTableLength;   
  80.   
  81.     // 內存複製   
  82.     memcpy(lpByte, lpDib, dwFileSize - sizeof(BITMAPFILEHEADER));   
  83.   
  84.     // 釋放空間   
  85.     delete[] lpDib;   
  86.     CloseHandle(hFile);   
  87.         return TRUE;   
  88. }  

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章