| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include "../pch/pch.h"
- #include "CBitmapHelper.h"
- CBitmapHelper::CBitmapHelper()
- {
- }
- CBitmapHelper::~CBitmapHelper()
- {
- if(m_bmp != NULL)
- {
- delete m_bmp;
- }
- }
- void CBitmapHelper::LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
- {
- Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
- bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite,
- PixelFormat32bppARGB, data);
- }
- void CBitmapHelper::UnlockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
- {
- bmp->UnlockBits(data);
- }
- void CBitmapHelper::Gray(BitmapData *data)
- {
- PARGBQuad p = (PARGBQuad)data->Scan0;
- INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
- for(UINT y = 0; y < data->Height; y++, p = (PARGBQuad)((BYTE*)p + offset))
- {
- for(UINT x = 0; x < data->Width; x++, p++)
- p->Blue = p->Green = p->Red =
- (UINT)(p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8;
- }
- }
- void CBitmapHelper::GrayAnd2Values(BitmapData *data)
- {
- PARGBQuad p = (PARGBQuad)data->Scan0;
- INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
- for(UINT y = 0; y < data->Height; y++, p = (PARGBQuad)((BYTE*)p + offset))
- {
- for(UINT x = 0; x < data->Width; x++, p++)
- {
- if(((p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8) < m_threshold)
- {
- //灰度值不够,就变为黑色
- p->Color &= 0xff000000;
- }
- else
- {
- //灰度值高,就是白色
- p->Color |= 0x00ffffff;
- }
- }
- }
- }
- /*
- *加载一张图片,并保存为二值图的格式
- **/
- void CBitmapHelper::Image2Values()
- {
- BitmapData data;
- LockBitmap(m_bmp, &data);
- GrayAnd2Values(&data);
- UnlockBitmap(m_bmp, &data);
- }
- Gdiplus::Bitmap* CBitmapHelper::getBmp()
- {
- return m_bmp;
- }
- void CBitmapHelper::ScaleBitmap(UINT nWidth, UINT nHeight)
- {
- Bitmap * pTemp = new Bitmap(nWidth, nHeight, m_bmp->GetPixelFormat());
- if(pTemp)
- {
- Graphics * g = Graphics::FromImage(pTemp);
- if(g)
- {
- g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
- g->DrawImage(m_bmp, 0, 0, nWidth, nHeight);
- delete g;
- }
- }
- delete m_bmp;
- m_bmp = pTemp;
- }
- void CBitmapHelper::LoadImage(std::wstring wsPath)
- {
- m_bmp = new Gdiplus::Bitmap(wsPath.c_str());
- }
|