CDIB.CPP
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 6k
Category:

Special Effects

Development Platform:

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. }
  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.     
  18.     dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  19.     if (bitmapFileHeader.bfType == 0x4d42)
  20.     {
  21.         DWORD fileLength = dibFile.GetLength();    
  22.         DWORD size = fileLength -
  23. sizeof(BITMAPFILEHEADER);
  24.         BYTE* pDib =
  25.             (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
  26.         dibFile.Read((void*)pDib, size);
  27.         dibFile.Close();
  28.         m_pBitmapInfo = (BITMAPINFO*) pDib;
  29.         m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;
  30.         m_pRGB = (RGBQUAD*)(pDib +
  31. m_pBitmapInfoHeader->biSize);
  32.         int m_numberOfColors = GetNumberOfColors();
  33.         if (m_pBitmapInfoHeader->biClrUsed == 0)
  34.             m_pBitmapInfoHeader->biClrUsed =
  35.     m_numberOfColors;
  36.         DWORD colorTableSize = m_numberOfColors *
  37.             sizeof(RGBQUAD);
  38.         m_pData = pDib + m_pBitmapInfoHeader->biSize
  39.             + colorTableSize;
  40. if (m_pRGB == (RGBQUAD*)m_pData) // No color table
  41. m_pRGB = NULL;
  42.         m_pBitmapInfoHeader->biSizeImage = GetSize();
  43. m_valid = TRUE;
  44.     }    
  45.     else
  46.     {
  47.         m_valid = FALSE;
  48.         AfxMessageBox("This isn't a bitmap file!");
  49.     }
  50. }
  51. BOOL CDib::IsValid()
  52. {
  53.     return m_valid;
  54. }
  55.         
  56. char* CDib::GetFileName()
  57. {
  58.     return m_fileName;
  59. }
  60.         
  61. UINT CDib::GetWidth()
  62. {
  63.     return (UINT) m_pBitmapInfoHeader->biWidth;
  64. }
  65.         
  66. UINT CDib::GetHeight()
  67. {
  68.     return (UINT) m_pBitmapInfoHeader->biHeight;
  69. }
  70.         
  71. DWORD CDib::GetSize()
  72. {
  73.     if (m_pBitmapInfoHeader->biSizeImage != 0)
  74.         return m_pBitmapInfoHeader->biSizeImage;
  75. else
  76.     {
  77.         DWORD height = (DWORD) GetHeight();
  78.         DWORD width = (DWORD) GetWidth();
  79.         return height * width;
  80.     }
  81. }
  82. DWORD CDib::GetDibWidthBytes()
  83. {
  84.      byBitCount=m_pBitmapInfoHeader->biBitCount;
  85. LONG nWidth=m_pBitmapInfoHeader->biWidth;
  86. dwWidthBytes = (DWORD)m_pBitmapInfoHeader->biWidth; //8-bits
  87. if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
  88. else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
  89. else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;
  90. while((dwWidthBytes & 3) != 0)dwWidthBytes++;
  91. return dwWidthBytes;
  92. }
  93. UINT CDib::GetNumberOfColors()
  94. {
  95. int numberOfColors;
  96.     if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
  97.           (m_pBitmapInfoHeader->biBitCount < 9))
  98. {
  99. switch (m_pBitmapInfoHeader->biBitCount)
  100. {
  101.     case 1: numberOfColors = 2; break;
  102.     case 4: numberOfColors = 16; break;
  103.     case 8: numberOfColors = 256;
  104. }
  105. }
  106.     else
  107. numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed;
  108.     return numberOfColors;
  109. }
  110.     
  111. BYTE* CDib::GetData()
  112. {
  113.     return m_pData;
  114. }
  115. BYTE* CDib::GetData2()
  116. {
  117.     if(GetRGB())
  118.        m_pData2=m_pData;
  119. return m_pData2;
  120. }
  121. RGBQUAD* CDib::GetRGB()
  122. {
  123.     return m_pRGB;
  124. }
  125. BITMAPINFO* CDib::GetInfo()
  126. {
  127.     return m_pBitmapInfo;
  128. }
  129. WORD CDib::PaletteSize(LPBYTE lpDIB) 
  130.     return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); 
  131. WORD CDib::DIBNumColors(LPBYTE lpDIB) 
  132.     WORD wBitCount;  // DIB bit count 
  133.     wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount; 
  134.     switch (wBitCount) 
  135.     { 
  136.         case 1: 
  137.             return 2; 
  138.         case 4: 
  139.             return 16; 
  140.         case 8: 
  141.             return 256; 
  142.         default: 
  143.             return 0; 
  144.     } 
  145. void CDib::SaveFile(const CString filename)
  146. {
  147.     BITMAPFILEHEADER    bmfHdr;     // Header for Bitmap file 
  148.     LPBITMAPINFOHEADER  lpBI;       // Pointer to DIB info structure 
  149.     DWORD               dwDIBSize; 
  150.  
  151.     bmfHdr.bfType = 0x4d42;  // "BM" 
  152.     lpBI = (LPBITMAPINFOHEADER)m_pBitmapInfoHeader; 
  153.     dwDIBSize = *(LPDWORD)lpBI + PaletteSize((LPBYTE)lpBI);   
  154.     if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4)) 
  155.         dwDIBSize += lpBI->biSizeImage; 
  156.     else 
  157.     { 
  158.         DWORD dwBmBitsSize;  // Size of Bitmap Bits only 
  159.         dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * 
  160.                 lpBI->biHeight; 
  161.         dwDIBSize += dwBmBitsSize; 
  162.         lpBI->biSizeImage = dwBmBitsSize; 
  163.     } 
  164.     bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER); 
  165.     bmfHdr.bfReserved1 = 0; 
  166.     bmfHdr.bfReserved2 = 0; 
  167.     bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + 
  168.             PaletteSize((LPBYTE)lpBI); 
  169.  
  170. CFile dibFile(filename, CFile::modeWrite|CFile::modeCreate);
  171. dibFile.Write(&bmfHdr, sizeof(BITMAPFILEHEADER));
  172. dibFile.WriteHuge(lpBI, dwDIBSize);
  173. dibFile.Close();
  174. }
  175. void CDib::RGBtoGrade()
  176. if(GetRGB())
  177.        m_pData2=m_pData;
  178. else
  179. {
  180. BYTE r,g,b;
  181. int height,wide,size;
  182. height=GetHeight();
  183. wide=GetWidth();
  184. size=height*wide;
  185. m_pData2=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
  186. LONG lLineBytes =GetDibWidthBytes();
  187. for(int j=0; j<height; j++)
  188. {
  189. for(int  i=0; i<wide; i++)
  190. {
  191. b=m_pData[j*lLineBytes+3*i];
  192. g=m_pData[j*lLineBytes+3*i+1];
  193. r=m_pData[j*lLineBytes+3*i+2];
  194. m_pData2[j*wide+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  195. }
  196. }
  197. }
  198. }
  199. void CDib::GradetoRGB()
  200. {
  201. if(GetRGB())
  202.        m_pData2=m_pData;
  203.    else
  204.    {
  205.    BYTE r,g,b;
  206. int height,wide;
  207. height=GetHeight();
  208. wide=GetWidth();
  209. LONG lLineBytes =GetDibWidthBytes();
  210. for(int j=0; j<height; j++)
  211. {
  212. for(int  i=0; i<wide; i++)
  213. {
  214. m_pData[(height-j-1)*lLineBytes+3*i]=m_pData2[(height-1-j)*wide+i];
  215. m_pData[(height-j-1)*lLineBytes+3*i+1]=m_pData2[(height-1-j)*wide+i];
  216. m_pData[(height-j-1)*lLineBytes+3*i+2]=m_pData2[(height-1-j)*wide+i];
  217. }
  218. }
  219.    }
  220. }