CDIB.CPP
Upload User: jjlianmen
Upload Date: 2022-08-03
Package Size: 157k
Code Size: 4k
Category:

Special Effects

Development Platform:

Matlab

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