设计CDib类

来源:互联网 发布:数据备份方案 编辑:程序博客网 时间:2024/05/17 09:32
  1. CDib类头文件

  2. #ifndef _CDIB_H
  3. #define _CDIB_H
  4. class CDib:public CObject
  5. {
  6. public:
  7.     RGBQUAD* m_pRGB;
  8.     BYTE* m_pData,*m_pData2;
  9.     UINT m_numberOfColors;
  10.     BOOL m_valid;
  11.     BITMAPFILEHEADER bitmapFileHeader;
  12.     
  13.     BITMAPINFOHEADER* m_pBitmapInfoHeader;
  14.     BITMAPINFO* m_pBitmapInfo;
  15.     int byBitCount;
  16.     DWORD dwWidthBytes;
  17.     BYTE* pDib;
  18.     DWORD size;
  19.     
  20. public:
  21.     CDib();
  22.     ~CDib();
  23.     
  24.     char m_fileName[256];
  25.     char* GetFileName();
  26.     BOOL IsValid();
  27.     DWORD GetSize();
  28.     UINT GetWidth();
  29.     UINT GetHeight();
  30.     UINT GetNumberOfColors();
  31.     RGBQUAD* GetRGB();
  32.     BYTE*  GetData();
  33.     BYTE* GetData2();
  34.     DWORD GetDibWidthBytes();
  35.     BITMAPINFO * GetInfo();
  36.     WORD PaletteSize(LPBYTE lpDIB);
  37.     WORD DIBNumColors(LPBYTE lpDIB);
  38.     void SaveFile(const CString filename);
  39.     
  40. public:
  41.     void GradetoRGB();
  42.     void RGBtoGrade();
  43.     void LoadFile(const char* dibFileName);
  44. };
  45. #endif

  1. CDib类

  2. #include "StdAfx.h"
  3. #include "dib.h"
  4. #include "windowsx.h"
  5. #define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)

  6. CDib::CDib()
  7. {

  8. }
  9. CDib::~CDib()
  10.   {
  11.     GlobalFreePtr(m_pBitmapInfo);
  12.   }

  13. void CDib::LoadFile(const char* dibFileName)
  14. {
  15.     strcpy(m_fileName,dibFileName);
  16.     CFile dibFile(m_fileName,CFile::modeRead);

  17.     dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));

  18.     if (bitmapFileHeader.bfType == 0x4d42)
  19.     {
  20.         DWORD fileLength=dibFile.GetLength();
  21.         DWORD size=fileLength-sizeof(BITMAPFILEHEADER);
  22.         BYTE* pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);
  23.         dibFile.Read((void*)pDib,size);
  24.         dibFile.Close();

  25.         m_pBitmapInfo=(BITMAPINFO*)pDib;
  26.         m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib;
  27.         m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize);
  28.         int m_numberOfColors=GetNumberOfColors();
  29.         if (m_pBitmapInfoHeader->biClrUsed==0)
  30.             m_pBitmapInfoHeader->biClrUsed=m_numberOfColors;
  31.         DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);
  32.         m_pData=pDib+m_pBitmapInfoHeader->biSize+colorTableSize;
  33.         if(m_pRGB==(RGBQUAD*)m_pData)
  34.             m_pRGB=NULL;
  35.         m_pBitmapInfoHeader->biSizeImage=GetSize();
  36.         m_valid=TRUE;
  37.     }
  38.     else
  39.     {
  40.         m_valid=FALSE;
  41.         AfxMessageBox("This isn't a bitmap file");
  42.     }
  43. }

  44. BOOL CDib::IsValid()
  45. {
  46.     return m_valid;
  47. }

  48. char* CDib::GetFileName()
  49. {
  50.     return m_fileName;
  51. }

  52. UINT CDib::GetWidth()
  53. {
  54.     return (UINT)m_pBitmapInfoHeader->biWidth;
  55. }

  56. UINT CDib::GetHeight()
  57. {
  58.     return (UINT)m_pBitmapInfoHeader->biHeight;
  59. }

  60. DWORD CDib::GetSize()
  61. {
  62.     if (m_pBitmapInfoHeader->biSizeImage!=0)
  63.     return m_pBitmapInfoHeader->biSizeImage;

  64.     else
  65.     {
  66.         DWORD height=(DWORD) GetHeight();
  67.         DWORD width=(DWORD) GetWidth();
  68.         return height * width; 
  69.     }
  70. }

  71. DWORD CDib::GetDibWidthBytes()
  72. {
  73.     byBitCount=m_pBitmapInfoHeader->biBitCount;
  74.     LONG nWidth=m_pBitmapInfoHeader->biWidth;

  75.     dwWidthBytes=(DWORD)m_pBitmapInfoHeader->biWidth;
  76.     if(byBitCount==1) dwWidthBytes=(nWidth+7)/8;
  77.     else if(byBitCount==4) dwWidthBytes=(nWidth+1)/2;
  78.     else if(byBitCount==24) dwWidthBytes=3*nWidth;
  79.     
  80.     while ((dwWidthBytes&3)!=0)
  81.     dwWidthBytes++;
  82.     return dwWidthBytes;
  83. }

  84. UINT CDib::GetNumberOfColors()
  85. {
  86.     int numberOfColors;

  87.     if((m_pBitmapInfoHeader->biClrUsed==0)&&(m_pBitmapInfoHeader->biBitCount<9))
  88.     {
  89.         switch(m_pBitmapInfoHeader->biBitCount)
  90.         {
  91.         case 1:numberOfColors=2;
  92.             break;
  93.         case 4:numberOfColors=16;
  94.             break;
  95.         case 8:numberOfColors=256;
  96.         }
  97.     }
  98.     else
  99.         numberOfColors=(int)m_pBitmapInfoHeader->biClrUsed;

  100.     return numberOfColors;
  101. }

  102. BYTE* CDib::GetData()
  103. {
  104.     return m_pData;
  105. }

  106. BYTE* CDib::GetData2()
  107. {
  108.     if(GetRGB())
  109.         m_pData2=m_pData;
  110.     return m_pData2;
  111. }

  112. RGBQUAD* CDib::GetRGB()
  113. {
  114.     return m_pRGB;
  115. }

  116. BITMAPINFO* CDib::GetInfo()
  117. {
  118.     return m_pBitmapInfo;
  119. }

  120. WORD CDib::PaletteSize(LPBYTE lpDIB)
  121. {
  122.     return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE));
  123. }

  124. WORD CDib::DIBNumColors(LPBYTE lpDIB)
  125. {
  126.     WORD wBitCount;
  127.     wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
  128.     switch(wBitCount)
  129.     {
  130.     case 1:
  131.         return 2;
  132.     case 4:
  133.         return 16;
  134.     case 8: 
  135.         return 256;
  136.     default
  137.         return 0;
  138.     }
  139. }

  140. void CDib::SaveFile(const CString filename)
  141. {
  142.     BITMAPFILEHEADER bmfHdr;  //Header for Bitmap file
  143.     LPBITMAPINFOHEADER lpBI;  //Pointer to DIB info structure
  144.     DWORD dwDIBSize; 

  145.     bmfHdr.bfType=0x4d42; //"BM"
  146.     lpBI=(LPBITMAPINFOHEADER)m_pBitmapInfoHeader;
  147.     dwDIBSize=*(LPDWORD)lpBI+PaletteSize((LPBYTE)lpBI);
  148.     if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
  149.         dwDIBSize+=lpBI->biSizeImage;
  150.     else
  151.     {
  152.         DWORD dwBmBitsSize;  //Size of Bitmap Bits only
  153.         dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
  154.         dwDIBSize += dwBmBitsSize;
  155.         lpBI->biSizeImage=dwBmBitsSize;
  156.     }
  157.     bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
  158.     bmfHdr.bfReserved1=0;
  159.     bmfHdr.bfReserved2=0;
  160.     bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPBYTE)lpBI);

  161.     CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate);
  162.     dibFile.Write(&bmfHdr,sizeof(BITMAPFILEHEADER));
  163.     dibFile.WriteHuge(lpBI,dwDIBSize);
  164.     dibFile.Close();
  165. }

  166. void CDib::RGBtoGrade()
  167. {
  168.     if(GetRGB())
  169.         m_pData2=m_pData;
  170.     else
  171.     {
  172.         BYTE r,g,b;
  173.         int height,wide,size;
  174.         height=GetHeight();
  175.         wide=GetWidth();
  176.         size=height*wide;
  177.         m_pData2=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);
  178.         LONG lLineBytes=GetDibWidthBytes();
  179.         for (int j=0;j<height;j++)
  180.         {
  181.             for (int i=0;i<wide;i++)
  182.             {
  183.                 b=m_pData[j*lLineBytes+3*i];
  184.                 g=m_pData[j*lLineBytes+3*i+1];
  185.                 r=m_pData[j*lLineBytes+3*i+2];
  186.                 m_pData2[j*wide+i]=(BYTE)(0.3*r+0.59*g+0.11*b);
  187.             }
  188.         }
  189.     }
  190. }


  191. void CDib::GradetoRGB()
  192. {
  193.     if(GetRGB())
  194.         m_pData2=m_pData;
  195.     else
  196.     {
  197.         BYTE r,g,b;
  198.         int height,wide;
  199.         height=GetHeight();
  200.         wide=GetWidth();
  201.         LONG lLineBytes=GetDibWidthBytes();
  202.         for(int j=0;j<height;j++)
  203.         {
  204.             for(int i=0;i<wide;i++)
  205.             {
  206.                 m_pData[(height-j-1*lLineBytes+3*i)]=m_pData2[(height-1-j)*wide+i];
  207.                 m_pData[(height-j-1*lLineBytes+3*i+1)]=m_pData2[(height-1-j)*wide+i];
  208.                 m_pData[(height-j-1*lLineBytes+3*i+2)]=m_pData2[(height-1-j)*wide+i];

  209.             }
  210.         }
  211.     }
  212. }



原创粉丝点击