一个简单的CDIB类

来源:互联网 发布:软件开发的职业规划 编辑:程序博客网 时间:2024/05/16 16:59

转自:http://blog.csdn.net/sjiang2142/article/details/6445108

头文件Cdib.h

view plain
  1. #ifndef __CDIB_H  
  2. #define __CDIB_H  
  3.   
  4. class CDib : public CObject  
  5. {  
  6. public:  
  7.     BITMAPFILEHEADER bitmapFileHeader;//位图文件头结构  
  8.     BYTE* pDib;//指向位图文件内容的指针  
  9.     DWORD size;//位图信息大小  
  10.     BITMAPINFO* m_pBitmapInfo;//指向位图信息的指针  
  11.     BITMAPINFOHEADER* m_pBitmapInfoHeader;//指向位图信息头的指针  
  12.     RGBQUAD* m_pPalette;//指向调色板的指针  
  13.     BYTE* m_pData;//指向位图数据的指针  
  14.     BOOL m_valid;//判断是否是位图文件  
  15.     CPalette m_Palette;//调色板对象  
  16.     int m_nPaletteEntries;//调色板颜色数目  
  17.     int m_WIDTHBYTES;//字节宽  
  18. public:  
  19.     CDib();  
  20.     ~CDib();  
  21.       
  22.     DWORD GetSize();//获得图像数据大小,以字节为单位  
  23.     void DrawImage(CPaintDC* dc,int left,int top,int right,int bottom);//绘制图像  
  24.     void LoadFile(CString filePath);//加载位图文件  
  25.     void SaveFile(CString filePath);//保存位图文件  
  26. };  
  27.   
  28. #endif  

源文件Cdib.cpp

view plain
  1. #include "stdafx.h"  
  2. #include "cdib.h"  
  3. #include "windowsx.h"  
  4. #include "math.h"  
  5. #define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)   
  6.   
  7. CDib::CDib()  
  8. {  
  9.     size=0;//位图信息大小  
  10. }  
  11.   
  12. CDib::~CDib()  
  13. {  
  14.     GlobalFreePtr(pDib);//释放内存  
  15. }  
  16.   
  17. //加载位图数据  
  18. void CDib::LoadFile(CString filePath)  
  19. {  
  20.     CFile dibFile(filePath, CFile::modeRead);//通过文件路径创建一个文件  
  21.     dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//读取文件头到文件头结构  
  22.     if (bitmapFileHeader.bfType == 0x4d42)//判断文件类型是否是位图文件  
  23.     {  
  24.         DWORD fileLength = dibFile.GetLength();//获得文件大小      
  25.         size = fileLength -sizeof(BITMAPFILEHEADER);//获得位图信息大小  
  26.         pDib = (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);//分配一大小为size的可移动内存块  
  27.         dibFile.Read((void*)pDib, size);//将数据读取到位图信息指针所指向的内存  
  28.         dibFile.Close();//关闭位图文件  
  29.   
  30.         m_pBitmapInfo = (BITMAPINFO*) pDib;//获取位图信息指针  
  31.         m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;//获取位图信息头指针  
  32.         m_pPalette = (RGBQUAD*)(pDib + m_pBitmapInfoHeader->biSize);//获得位图颜色表指针  
  33.   
  34.         m_pBitmapInfoHeader->biSizeImage = GetSize();//获得位图数据大小  
  35.   
  36.         // 计算调色板中实际颜色数量  
  37.         m_nPaletteEntries = 1 << m_pBitmapInfoHeader->biBitCount;//逻辑值  
  38.         //实际值  
  39.         if( m_pBitmapInfoHeader->biBitCount > 8 )  
  40.         {  
  41.             m_nPaletteEntries = 0;  
  42.         }  
  43.         else if( m_pBitmapInfoHeader->biClrUsed != 0 )  
  44.         {  
  45.             m_nPaletteEntries = m_pBitmapInfoHeader->biClrUsed;  
  46.         }  
  47.   
  48.         DWORD colorTableSize = m_nPaletteEntries * sizeof(RGBQUAD);//颜色表大小  
  49.         m_pData = pDib + m_pBitmapInfoHeader->biSize + colorTableSize;//获得位图数据的指针  
  50.   
  51.         if (m_pPalette == (RGBQUAD*)m_pData)//没有调色板的情况  
  52.         {  
  53.             m_pPalette = NULL;  
  54.         }  
  55.         else//有调色板的情况,创建调色板对象  
  56.         {  
  57.             // 重置全局调色板  
  58.             if( m_Palette.GetSafeHandle() != NULL )  
  59.             {  
  60.                 m_Palette.DeleteObject();  
  61.             }     
  62.               
  63.             //为逻辑调色板分配内存,通过逻辑调色板创建调色板  
  64.             LOGPALETTE *pLogPal = (LOGPALETTE *) new char  
  65.                     [sizeof(LOGPALETTE)+  
  66.                     m_nPaletteEntries*sizeof(PALETTEENTRY)];  
  67.   
  68.             if( pLogPal != NULL ){  
  69.   
  70.                 //设置逻辑调色板的版本  
  71.                 pLogPal->palVersion = 0x300;  
  72.                 //设置逻辑调色板的颜色数量  
  73.                 pLogPal->palNumEntries = m_nPaletteEntries;  
  74.   
  75.                 //为每个颜色实体赋颜色值  
  76.                 forint i=0; i<m_nPaletteEntries; i++ ){  
  77.                     pLogPal->palPalEntry[i].peRed =  
  78.                         m_pPalette[i].rgbRed;  
  79.                     pLogPal->palPalEntry[i].peGreen =  
  80.                         m_pPalette[i].rgbGreen;  
  81.                     pLogPal->palPalEntry[i].peBlue =  
  82.                         m_pPalette[i].rgbBlue;  
  83.                     }  
  84.   
  85.                 //创建调色板  
  86.                 m_Palette.CreatePalette( pLogPal );  
  87.                 //释放内存  
  88.                 delete [] pLogPal;  
  89.                 }  
  90.         }  
  91.   
  92.         m_WIDTHBYTES = WIDTHBYTES((m_pBitmapInfoHeader->biWidth)*((DWORD)m_pBitmapInfoHeader->biBitCount));  
  93.   
  94.         m_valid = TRUE;//位图文件读取成功  
  95.     }      
  96.     else  
  97.     {  
  98.         m_valid = FALSE;//位图文件读取失败  
  99.     }  
  100. }  
  101.   
  102. //获得图像数据大小,以字节为单位          
  103. DWORD CDib::GetSize()  
  104. {  
  105.     if (m_pBitmapInfoHeader->biSizeImage != 0)  
  106.     {  
  107.         return m_pBitmapInfoHeader->biSizeImage;  
  108.     }  
  109.     else  
  110.     {  
  111.         return WIDTHBYTES((m_pBitmapInfoHeader->biWidth)*((DWORD)m_pBitmapInfoHeader->biBitCount))*m_pBitmapInfoHeader->biHeight;  
  112.     }  
  113. }      
  114.   
  115. //保存位图文件  
  116. void CDib::SaveFile(CString filePath)  
  117. {   
  118.     CFile dibFile(filePath, CFile::modeCreate|CFile::modeWrite);  
  119.     dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));  
  120.     dibFile.Write((void*)pDib, size);  
  121.     dibFile.Close();  
  122. }  
  123.   
  124. //绘制图像  
  125. void CDib::DrawImage(CPaintDC* dc,int left,int top,int right,int bottom)  
  126. {  
  127.     //如果有调色板则使用调色板  
  128.     if(m_Palette.GetSafeHandle()!=NULL)  
  129.     {  
  130.         CPalette *pOldPalette;  
  131.         pOldPalette = dc->SelectPalette( &m_Palette, FALSE );//选择调色板  
  132.         dc->RealizePalette();//实现调色板  
  133.   
  134.         //绘图  
  135.         StretchDIBits( dc->m_hDC, left, top,  
  136.             right,bottom,  
  137.             0, 0,  
  138.             m_pBitmapInfoHeader->biWidth,m_pBitmapInfoHeader->biHeight,  
  139.             m_pData,  
  140.             (BITMAPINFO *) m_pBitmapInfo,  
  141.             BI_RGB, SRCCOPY );  
  142.   
  143.         //恢复调色板  
  144.         dc->SelectPalette( pOldPalette, FALSE );  
  145.     }  
  146.     else//没有调色板,直接绘制  
  147.     {  
  148.         StretchDIBits( dc->m_hDC, left, top,  
  149.             right,bottom,  
  150.             0, 0,  
  151.             m_pBitmapInfoHeader->biWidth,m_pBitmapInfoHeader->biHeight,  
  152.             m_pData,  
  153.             (BITMAPINFO *) m_pBitmapInfo,  
  154.             BI_RGB, SRCCOPY );  
  155.     }  
  156. }