- // 文件路徑:lpszPathName, 指向DIB位圖的指針
- BOOL ReadImge(LPCTSTR lpszPathName, LPBYTE lpByte)
- {
- LPBYTE lpDib;// DIB的指針
- HANDLE hFile;// 文件句柄
- HPALETTE hPalette;// 邏輯調色板句柄
- int nColorTableLength;// 顏色表長度
- int imgWidth;// 圖像的寬度
- int imgHeight;// 圖像的高度
- int nBitCount;// 每個像素點的位數
- unsigned char* pImgData;// 圖像數據
- LPBITMAPINFOHEADER lpBmpInfoHead;// 圖像信息頭指針
- LPRGBQUAD lpColorTable; // 圖像顏色表
- // 以只讀的方式打開一個文件
- hFile = CreateFile(lpszPathName, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- // 打開文件失敗
- if (INVALID_HANDLE_VALUE == hFile)
- return FALSE;
- // 文件頭結構
- BITMAPFILEHEADER bmfn;
- DWORD dwRead;
- // 讀入數據到文件頭
- if (FALSE == ReadFile(hFile, (LPVOID)&bmfn, sizeof(BITMAPFILEHEADER), &dwRead, NULL))
- return FALSE;
- // 讀取文件的大小
- DWORD dwFileSize;
- dwFileSize = GetFileSize(hFile, NULL);
- printf("%d", dwFileSize);
- // 分配內存大小
- lpDib = new BYTE[dwFileSize - sizeof(BITMAPFILEHEADER)];
- // 讀入數據到內存
- if (FALSE == ReadFile(hFile, lpDib, dwFileSize - sizeof(BITMAPFILEHEADER), &dwRead, NULL))
- return FALSE;
- // 指針類型轉換
- lpBmpInfoHead = (LPBITMAPINFOHEADER)lpDib;
- //圖像的寬度
- imgWidth = lpBmpInfoHead->biWidth;
- // 圖像的高度
- imgHeight = lpBmpInfoHead->biHeight;
- // 每個像素佔得位數
- nBitCount = lpBmpInfoHead->biBitCount;
- // 計算顏色表的長度
- nColorTableLength = ComputeColorTableLength(nBitCount);
- // 邏輯調色板句柄
- hPalette = NULL;
- // 顏色表長度不爲0表示圖像不是真彩色,要使用調色板
- if (nColorTableLength != 0)
- {
- // 圖像=位圖文件頭+位圖信息頭+調色板數據+像素數據
- // image = BITMAPFILEHEADER + BITMAPINFOHEADER + RGBQUAD + IMAGEDATA
- // 指向調色板數據指針
- lpColorTable = (LPRGBQUAD)(lpDib + sizeof(BITMAPINFOHEADER));
- // 創建邏輯調色板
- MakePalette(nColorTableLength, lpColorTable, hPalette);
- //memcpy(lpColor, lpColorTable, sizeof(RGBQUAD));
- }
- // 圖像數據
- pImgData = (LPBYTE)lpDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nColorTableLength;
- // 內存複製
- memcpy(lpByte, lpDib, dwFileSize - sizeof(BITMAPFILEHEADER));
- // 釋放空間
- delete[] lpDib;
- CloseHandle(hFile);
- return TRUE;
- }