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. }  

 

 

 

 

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