Image.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:2k
源码类别:

图片显示

开发平台:

Visual C++

  1. // Image.cpp: implementation of the CImage class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "QuickImage.h"
  6. #include "Image.h"
  7. #include <math.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. CImage::CImage()
  17. {
  18. *m_szPathName='';
  19. m_iWidth=m_iHeight=0;
  20. }
  21. CImage::~CImage()
  22. {
  23. }
  24. BOOL CImage::ReadFromFile(const LPCTSTR lpszFile)
  25. {
  26. return TRUE;
  27. }
  28. HDIB CImage::Show()
  29. {
  30. return NULL;
  31. }
  32. void CImage::Properties(int *Histogram, double &dMean, double &dStdDev, double &dShang,
  33. const LPSTR lpBits, int iPixels, int iColors)
  34. {
  35. ASSERT(NULL != lpBits);
  36. ASSERT(NULL != Histogram);
  37. int iValue;
  38. dMean = dStdDev = dShang = 0.0;
  39. for(int i = 0; i< 256; i++)
  40. {
  41. Histogram[i] = 0;
  42. }
  43. if(iColors < 257)
  44. {
  45. BYTE *pBits = (BYTE*)lpBits;
  46. for(i =0; i< iPixels; i++, pBits++)
  47. {
  48. Histogram[*pBits] ++;
  49. }
  50. for(i = 0; i < 256; i++)
  51. {
  52. iValue = Histogram[i];
  53. dMean += iValue * i;
  54. if(iValue != 0)
  55. {
  56. dStdDev = (double)iValue / iPixels;
  57. dShang -= dStdDev * log10(dStdDev) / log10(2.0);
  58. }
  59. }
  60. dMean /= (double)iPixels;
  61. pBits = (BYTE*)lpBits;
  62. dStdDev = 0;
  63. double d;
  64. for(i = 0; i < iPixels; i++, pBits++)
  65. {
  66. d = double(*pBits) - dMean;
  67. dStdDev += (d * d);
  68. }
  69. dStdDev = sqrt(dStdDev / iPixels);
  70. }
  71. else
  72. {
  73. //int iGray;
  74. }
  75. }
  76. const HDIB CImage::HistoEqualize(const HDIB hDIB)
  77. {
  78. ASSERT(NULL != hDIB);
  79. LPSTR lpDIB = (LPSTR)GlobalLock(hDIB);
  80. if(NULL == lpDIB)
  81. {
  82. return NULL;
  83. }
  84. int iWidth = ::DIBWidth(lpDIB);
  85. int iPixel = iWidth * abs(::DIBHeight(lpDIB));
  86. int iColors = ::DIBNumColors(lpDIB);
  87. int Histogram[256];
  88. double dMean, dStdDev, dShag;
  89. LPSTR lpBits = ::FindDIBBits(lpDIB);
  90. double dGray = 255.0 / (double)iPixel;
  91. int i;
  92. HDIB hRet = NULL;
  93. if(iColors < 257)
  94. {
  95. Properties(Histogram, dMean, dStdDev, dShag, lpBits, iPixel, iColors);
  96. for(i = 1 ; i < 256; i++)
  97. {
  98. Histogram[i] += Histogram[i-1];
  99. }
  100. BYTE *pByte = (BYTE*)lpBits;
  101. for(i = 0; i < iPixel; i++, pByte++)
  102. {
  103. *pByte = BYTE(dGray * Histogram[*pByte]);
  104. }
  105. hRet = ::GenBmp(iWidth, ::DIBHeight(lpDIB), 8, (BYTE*)lpBits);
  106. }
  107. else
  108. {
  109. }
  110. GlobalUnlock(hDIB);
  111. return hRet;
  112. }