CDIB.CPP
上传用户:hnhlzg
上传日期:2013-10-19
资源大小:289k
文件大小:5k
源码类别:

数学计算

开发平台:

Visual C++

  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. CDib::CDib()
  7. {
  8. size=0;
  9. byBitCount=8;
  10. }
  11. CDib::~CDib()
  12. {
  13.     GlobalFreePtr(m_pBitmapInfo);
  14. }
  15. void CDib::LoadFile(const char* dibFileName)
  16. {
  17.    strcpy(m_fileName,dibFileName);
  18.     CFile dibFile(m_fileName, CFile::modeRead);
  19.     dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  20.     if (bitmapFileHeader.bfType == 0x4d42)
  21.     {
  22.         DWORD fileLength = dibFile.GetLength();    
  23.          size = fileLength -sizeof(BITMAPFILEHEADER);
  24.          pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
  25.         dibFile.Read((void*)pDib, size);
  26.         dibFile.Close();
  27.         m_pBitmapInfo = (BITMAPINFO*) pDib;
  28.         m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;
  29.         m_pRGB = (RGBQUAD*)(pDib +
  30. m_pBitmapInfoHeader->biSize);
  31.         int m_numberOfColors = GetNumberOfColors();
  32.         if (m_pBitmapInfoHeader->biClrUsed == 0)
  33.             m_pBitmapInfoHeader->biClrUsed =
  34.     m_numberOfColors;
  35.         DWORD colorTableSize = m_numberOfColors *
  36.             sizeof(RGBQUAD);
  37.         m_pData = pDib + m_pBitmapInfoHeader->biSize
  38.             + colorTableSize;
  39. byBitCount=8;
  40. if (m_pRGB == (RGBQUAD*)m_pData) // No color table
  41. { byBitCount=24;
  42. m_pRGB = NULL;
  43. size=m_pBitmapInfoHeader->biHeight*m_pBitmapInfoHeader->biWidth;
  44.    m_pData1 =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size );
  45.       LPBYTE temp1,temp;
  46.            LPBYTE  R,G,B;   //色彩缓存
  47.            int r,g,b;      //中间变量
  48.    temp1=m_pData1;
  49.    temp=m_pData;
  50.            for(int j=0;j<m_pBitmapInfoHeader->biHeight;j++)
  51.    for(int i=0;i<m_pBitmapInfoHeader->biWidth;i++)
  52.  { 
  53.                 
  54.      R=temp++;
  55.          G=temp++;
  56.      B=temp++;
  57.      r=*R;
  58.      g=*G;
  59.      b=*B;
  60.   int  gray=(g*59+r*30+b*11)/100;
  61.               *temp1=(BYTE)gray;
  62.   
  63.    temp1++;
  64.    }
  65.   
  66. }
  67.         
  68.         m_pBitmapInfoHeader->biSizeImage = GetSize();
  69. m_valid = TRUE;
  70.     }    
  71.     else
  72.     {
  73.         m_valid = FALSE;
  74.         AfxMessageBox("This isn't a bitmap file!");
  75.     }
  76. }
  77. BOOL CDib::IsValid()
  78. {
  79.     return m_valid;
  80. }
  81.         
  82. char* CDib::GetFileName()
  83. {
  84.     return m_fileName;
  85. }
  86.         
  87. UINT CDib::GetWidth()
  88. {
  89.     return (UINT) m_pBitmapInfoHeader->biWidth;
  90. }
  91.         
  92. UINT CDib::GetHeight()
  93. {
  94.     return (UINT) m_pBitmapInfoHeader->biHeight;
  95. }
  96.         
  97. DWORD CDib::GetSize()
  98. {
  99.     if (m_pBitmapInfoHeader->biSizeImage != 0)
  100.         return m_pBitmapInfoHeader->biSizeImage;
  101. else
  102.     {
  103.         DWORD height = (DWORD) GetHeight();
  104.         DWORD width = (DWORD) GetWidth();
  105.         return height * width;
  106.     }
  107. }
  108. UINT CDib::GetNumberOfColors()
  109. {
  110. int numberOfColors;
  111.     if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
  112.           (m_pBitmapInfoHeader->biBitCount < 9))
  113. {
  114. switch (m_pBitmapInfoHeader->biBitCount)
  115. {
  116.     case 1: numberOfColors = 2; break;
  117.     case 4: numberOfColors = 16; break;
  118.     case 8: numberOfColors = 256;
  119. }
  120. }
  121.     else
  122. numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed;
  123.     return numberOfColors;
  124. }
  125.     
  126. BYTE* CDib::GetData()
  127. {
  128.     return m_pData;
  129. }
  130. RGBQUAD* CDib::GetRGB()
  131. {
  132.     return m_pRGB;
  133. }
  134. BITMAPINFO* CDib::GetInfo()
  135. {
  136.     return m_pBitmapInfo;
  137. }
  138. WORD CDib::PaletteSize(LPBYTE lpDIB) 
  139.     return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); 
  140. WORD CDib::DIBNumColors(LPBYTE lpDIB) 
  141.     WORD wBitCount;  // DIB bit count 
  142.     wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount; 
  143.     switch (wBitCount) 
  144.     { 
  145.         case 1: 
  146.             return 2; 
  147.         case 4: 
  148.             return 16; 
  149.         case 8: 
  150.             return 256; 
  151.         default: 
  152.             return 0; 
  153.     } 
  154. void CDib::SaveFile(const CString filename)
  155.    strcpy(m_fileName,filename);
  156.     CFile dibFile(m_fileName, CFile::modeCreate|CFile::modeWrite);
  157.     dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  158.     dibFile.Write((void*)pDib, size);
  159.     dibFile.Close();
  160. }
  161. BYTE* CDib::GetData2()
  162. {
  163.     return m_pData1;
  164. }
  165. DWORD CDib::GetDibWidthBytes()
  166. {
  167.      byBitCount=m_pBitmapInfoHeader->biBitCount;
  168. LONG nWidth=m_pBitmapInfoHeader->biWidth;
  169. dwWidthBytes = (DWORD)m_pBitmapInfoHeader->biWidth; //8-bits
  170. if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
  171. else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
  172. else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;
  173. while((dwWidthBytes & 3) != 0)dwWidthBytes++;
  174. return dwWidthBytes;
  175. }