- // 文件路径: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;
- }