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

 

你可能感兴趣的:(win32图像的写操作)