Dib.cpp
上传用户:yuzhuan
上传日期:2013-03-16
资源大小:3596k
文件大小:4k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. // Dib.cpp: implementation of the Dib class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "bs.h"
  6. #include "Dib.h"
  7. #include "windowsx.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. #define WIDTH(bytes) (((bytes*8+31)/32)*4)
  17. CDib::CDib()
  18. {
  19. size=0;
  20. m_pData=NULL;
  21. }
  22. CDib::~CDib()
  23. {
  24. GlobalFreePtr(m_pBitmapInfo);
  25. }
  26. void CDib::LoadFile(const CString dibFileName)
  27. {
  28. strcpy(m_fileName,dibFileName);
  29. CFile dibFile(m_fileName,CFile::modeRead);
  30. dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  31. if(bitmapFileHeader.bfType==0x4d42)
  32. {
  33. DWORD fileLength=dibFile.GetLength();
  34. size=fileLength-sizeof(BITMAPFILEHEADER);
  35. pDib=(BYTE *)GlobalAllocPtr(GMEM_MOVEABLE,size);
  36.         dibFile.Read((void*)pDib,size);
  37.         dibFile.Close();
  38. m_pBitmapInfo=(BITMAPINFO *)pDib;
  39.         m_pBitmapInfoHeader=(BITMAPINFOHEADER *)pDib;
  40. m_pRGB=(RGBQUAD *)(pDib+m_pBitmapInfoHeader->biSize);
  41. int m_numberOfColors=GetNumberOfColors();
  42. if(m_pBitmapInfoHeader->biClrUsed==0)
  43. m_pBitmapInfoHeader->biClrUsed=m_numberOfColors;
  44. DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);
  45. m_pData=pDib+m_pBitmapInfoHeader->biSize+colorTableSize;
  46. if(m_pRGB==(RGBQUAD *)m_pData)
  47. m_pRGB=NULL;
  48. m_pBitmapInfoHeader->biSizeImage=GetSize();
  49. m_valid=TRUE;
  50. }
  51. else
  52. {
  53. m_valid=FALSE;
  54. }
  55. }
  56. BOOL CDib::IsValid()
  57. {
  58.     return m_valid;
  59. }
  60. char *CDib::GetFileName()
  61. {
  62. return m_fileName;
  63. }
  64. UINT CDib::GetWidth()//返回像素数
  65. {
  66. return (UINT) m_pBitmapInfoHeader->biWidth;
  67. }
  68. UINT CDib::GetHeight()//返回像素数
  69. {
  70. return (UINT) m_pBitmapInfoHeader->biHeight;
  71. }
  72. DWORD CDib::GetSize()//得到图像数据的大小,以字节为单位
  73. {
  74. if(m_pBitmapInfoHeader->biSizeImage!=0)
  75.        return m_pBitmapInfoHeader->biSizeImage;
  76. else
  77. {
  78. DWORD height=(DWORD)GetHeight();
  79. DWORD width=(DWORD)GetWidth();
  80. return (height*WIDTH(width*m_pBitmapInfoHeader->biBitCount)/8);
  81. }
  82. }
  83. UINT CDib::GetNumberOfColors()//图像实际使用的颜色表中的颜色数
  84. {
  85. int numberOfColors;
  86. if((m_pBitmapInfoHeader->biClrUsed==0)&&m_pBitmapInfoHeader->biBitCount<9)
  87. {
  88. switch(m_pBitmapInfoHeader->biBitCount)
  89. {
  90. case 1:numberOfColors=2;break;
  91. case 4:numberOfColors=16;break;
  92. case 8:numberOfColors=256;
  93. }
  94. }
  95. else
  96. {
  97. numberOfColors=(int) m_pBitmapInfoHeader->biClrUsed;
  98. }
  99. return numberOfColors;
  100. }
  101. BYTE *CDib::GetData()//得到图像数据
  102. {
  103. return m_pData;
  104. }
  105. RGBQUAD *CDib::GetRGB()//调色板指针
  106. {
  107. return m_pRGB;
  108. }
  109. BITMAPINFO *CDib::GetInfo()//图像信息
  110. {
  111. return m_pBitmapInfo;
  112. }
  113. WORD CDib::PaletteSize(LPBYTE lpDIB)//调色板大小
  114. {
  115. return (DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));
  116. }
  117. WORD CDib::DIBNumColors(LPBYTE lpDIB)//图像颜色数
  118. {
  119. WORD wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
  120. switch(wBitCount)
  121. {
  122. case 1:
  123. return 2;
  124. case 4:
  125. return 16;
  126. case 8:
  127. return 256;
  128. default:
  129. return 0;
  130. }
  131. }
  132. void CDib::SaveFile(const CString filename)
  133. {//保存经处理后宽度,高度均没有改变大小的图像
  134. strcpy(m_fileName,filename);
  135. CFile dibFile(m_fileName,CFile::modeCreate|CFile::modeWrite);
  136. dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  137. dibFile.Write((void*)pDib,size);
  138.     dibFile.Close();
  139. }
  140. CPalette * CDib::CreateBmpPalette()
  141. {
  142. struct{
  143.    WORD Version;
  144. WORD NumberOfEntries;
  145. PALETTEENTRY aEntries[256];
  146. }palette={0x300,256};
  147. LPRGBQUAD pRGBTable=GetRGB();
  148. UINT numberOfColors=GetNumberOfColors();
  149. for(UINT x=0;x<numberOfColors;++x)
  150. {
  151. palette.aEntries[x].peBlue=pRGBTable[x].rgbBlue;
  152. palette.aEntries[x].peGreen=pRGBTable[x].rgbGreen;
  153. palette.aEntries[x].peRed=pRGBTable[x].rgbRed;
  154. palette.aEntries[x].peFlags=0;
  155. }
  156. hPalette.CreatePalette((LPLOGPALETTE)&palette);
  157. return &hPalette;
  158. }