CBitmapHelper.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "../pch/pch.h"
  2. #include "CBitmapHelper.h"
  3. CBitmapHelper::CBitmapHelper()
  4. {
  5. }
  6. CBitmapHelper::~CBitmapHelper()
  7. {
  8. if(m_bmp != NULL)
  9. {
  10. delete m_bmp;
  11. }
  12. }
  13. void CBitmapHelper::LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
  14. {
  15. Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
  16. bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite,
  17. PixelFormat32bppARGB, data);
  18. }
  19. void CBitmapHelper::UnlockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
  20. {
  21. bmp->UnlockBits(data);
  22. }
  23. void CBitmapHelper::Gray(BitmapData *data)
  24. {
  25. PARGBQuad p = (PARGBQuad)data->Scan0;
  26. INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
  27. for(UINT y = 0; y < data->Height; y++, p = (PARGBQuad)((BYTE*)p + offset))
  28. {
  29. for(UINT x = 0; x < data->Width; x++, p++)
  30. p->Blue = p->Green = p->Red =
  31. (UINT)(p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8;
  32. }
  33. }
  34. void CBitmapHelper::GrayAnd2Values(BitmapData *data)
  35. {
  36. PARGBQuad p = (PARGBQuad)data->Scan0;
  37. INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
  38. for(UINT y = 0; y < data->Height; y++, p = (PARGBQuad)((BYTE*)p + offset))
  39. {
  40. for(UINT x = 0; x < data->Width; x++, p++)
  41. {
  42. if(((p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8) < m_threshold)
  43. {
  44. //灰度值不够,就变为黑色
  45. p->Color &= 0xff000000;
  46. }
  47. else
  48. {
  49. //灰度值高,就是白色
  50. p->Color |= 0x00ffffff;
  51. }
  52. }
  53. }
  54. }
  55. /*
  56. *加载一张图片,并保存为二值图的格式
  57. **/
  58. void CBitmapHelper::Image2Values()
  59. {
  60. BitmapData data;
  61. LockBitmap(m_bmp, &data);
  62. GrayAnd2Values(&data);
  63. UnlockBitmap(m_bmp, &data);
  64. }
  65. Gdiplus::Bitmap* CBitmapHelper::getBmp()
  66. {
  67. return m_bmp;
  68. }
  69. void CBitmapHelper::ScaleBitmap(UINT nWidth, UINT nHeight)
  70. {
  71. Bitmap * pTemp = new Bitmap(nWidth, nHeight, m_bmp->GetPixelFormat());
  72. if(pTemp)
  73. {
  74. Graphics * g = Graphics::FromImage(pTemp);
  75. if(g)
  76. {
  77. g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
  78. g->DrawImage(m_bmp, 0, 0, nWidth, nHeight);
  79. delete g;
  80. }
  81. }
  82. delete m_bmp;
  83. m_bmp = pTemp;
  84. }
  85. void CBitmapHelper::LoadImage(std::wstring wsPath)
  86. {
  87. m_bmp = new Gdiplus::Bitmap(wsPath.c_str());
  88. }