win32圖像的寫操作

Code:
  1. // 圖像的寫操作把DIB寫入lpszPathName中   
  2. // lpDib是指向信息頭的圖像指針   
  3. BOOL WriteImageNew(LPCTSTR lpszPathName,LPBYTE lpDib)   
  4. {   
  5.   
  6.     // 信息頭指針   
  7.     LPBITMAPINFOHEADER lpBmpInfoHead;    
  8.     // 文件頭   
  9.     BITMAPFILEHEADER bmfh;   
  10.        
  11.     // 指針類型轉換   
  12.     lpBmpInfoHead = (LPBITMAPINFOHEADER)lpDib;   
  13.   
  14.     // 計算顏色表長度   
  15.     int nColorTableLength = ComputeColorTableLength(lpBmpInfoHead->biBitCount);   
  16.   
  17.     // 文件類型"BM"    
  18.     bmfh.bfType = 0x4d42;   
  19.     bmfh.bfSize = 0;   
  20.     bmfh.bfReserved1 = bmfh.bfReserved2 = 0;   
  21.   
  22.     // 文件頭偏移量(從文件頭開始到實際圖像數據陣列字節間的字節偏移量)   
  23.     // 中間包括了文件頭、信息頭、調色板(真彩色圖像就沒有)   
  24.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nColorTableLength;   
  25.        
  26.     HANDLE hFile;   
  27.   
  28.     // 以寫的方式打開一個文件,不存在就創建新的   
  29.     hFile = CreateFile(lpszPathName, GENERIC_WRITE, 0, NULL,   
  30.         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);   
  31.   
  32.     if (INVALID_HANDLE_VALUE == hFile)   
  33.         return FALSE;   
  34.   
  35.     // 寫入文件頭   
  36.     DWORD dwWrite;   
  37.     if (!WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWrite, NULL))   
  38.         return FALSE;   
  39.   
  40.     // 寫入信息頭   
  41.     if (!WriteFile(hFile, lpBmpInfoHead, sizeof(BITMAPINFOHEADER), &dwWrite, NULL))   
  42.         return FALSE;   
  43.   
  44.     // 調色板指針   
  45.     LPRGBQUAD lpColorTable = (LPRGBQUAD)lpBmpInfoHead+ sizeof(BITMAPINFOHEADER);   
  46.   
  47.     // 如果顏色表長度不爲0就寫入調色板數據   
  48.     if (nColorTableLength != 0)   
  49.         if (!WriteFile(hFile, lpColorTable, sizeof(RGBQUAD)*nColorTableLength, &dwWrite, NULL))   
  50.         return FALSE;   
  51.   
  52.            
  53.     // 整幅圖像佔的字節大小   
  54.     // 像素點佔得字節數是4的整數倍   
  55.     // 可以這樣寫 (m_imgWidth*m_nBitCount/8+3)&~3;   
  56.     int imgBuffSize = (lpBmpInfoHead->biWidth*lpBmpInfoHead->biBitCount/8 + 3)/4*4*lpBmpInfoHead->biHeight;   
  57.   
  58.     // 圖像像素指針   
  59.     unsigned char* pImgData = (unsigned char *)lpColorTable + sizeof(RGBQUAD)*nColorTableLength;    
  60.   
  61.     // 寫入圖像像素數據   
  62.     if (!WriteFile(hFile, pImgData, imgBuffSize, &dwWrite, NULL))   
  63.         return FALSE;   
  64.   
  65.     // 關閉文件句柄   
  66.     CloseHandle(hFile);   
  67.   
  68.     return TRUE;   
  69.        
  70.   
  71. }  

 

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