ImageEx.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. #include "StdAfx.h"
  2. #include "ImageEx.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CImageEx::CImageEx()
  6. {
  7. //设置变量
  8. m_pImage=NULL;
  9. ZeroMemory(m_strImageName, sizeof(m_strImageName) );
  10. ::SetRect(&m_rcNinePart,0,0,0,0);
  11. return;
  12. }
  13. //析构函数
  14. CImageEx::~CImageEx()
  15. {
  16. //销毁图片
  17. DestroyImage();
  18. return;
  19. }
  20. //是否加载
  21. bool CImageEx::IsNull()
  22. {
  23. //加载判断
  24. if (m_pImage==NULL) return true;
  25. if (m_pImage->GetLastStatus()!=Ok) return true;
  26. return false;
  27. }
  28. //获取宽度
  29. INT CImageEx::GetWidth()
  30. {
  31. //加载判断
  32. ASSERT(IsNull()==false);
  33. if (IsNull()==true) return 0;
  34. //获取宽度
  35. return m_pImage->GetWidth();
  36. }
  37. //获取高度
  38. INT CImageEx::GetHeight()
  39. {
  40. //加载判断
  41. ASSERT(IsNull()==false);
  42. if (IsNull()==true) return 0;
  43. //获取高度
  44. return m_pImage->GetHeight();
  45. }
  46. //销毁图片
  47. bool CImageEx::DestroyImage()
  48. {
  49. //删除对象
  50. if (m_pImage!=NULL)
  51. {
  52. try {
  53. delete m_pImage;
  54. }
  55. catch (...)
  56. {
  57. ASSERT(FALSE);
  58. }
  59. m_pImage=NULL;
  60. }
  61. return true;
  62. }
  63. //加载图片
  64. bool CImageEx::LoadImage(LPCTSTR pszFileName)
  65. {
  66. //加载判断
  67. ASSERT(m_pImage==NULL);
  68. if (m_pImage!=NULL) return false;
  69. //加载文件
  70. CT2CW strFileName(pszFileName);
  71. m_pImage=Bitmap::FromFile((LPCWSTR)strFileName);
  72. //错误判断
  73. if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
  74. {
  75. DestroyImage();
  76. return false;
  77. }
  78. return true;
  79. }
  80. //加载图片
  81. bool CImageEx::LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType/*=TEXT("IMAGE")*/)
  82. {
  83. //加载判断
  84. ASSERT(m_pImage==NULL);
  85. if (m_pImage!=NULL) return false;
  86. //查找资源
  87. HRSRC hResource=FindResource(hInstance,pszResourceName,pszResourceType);
  88. if (hResource==NULL) return false;
  89. //读取资源
  90. DWORD dwImageSize=SizeofResource(hInstance,hResource);
  91. LPVOID pImageBuffer=LoadResource(hInstance,hResource);
  92. //创建数据
  93. IStream * pIStream=NULL;
  94. if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
  95. {
  96. ASSERT(FALSE);
  97. return false;
  98. }
  99. //写入数据
  100. pIStream->Write(pImageBuffer,dwImageSize,NULL);
  101. //创建位图
  102. m_pImage=Bitmap::FromStream(pIStream);
  103. //释放资源
  104. if(pIStream)
  105. {
  106. pIStream->Release();
  107. pIStream = NULL;
  108. }
  109. //错误判断
  110. if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
  111. {
  112. ASSERT(FALSE);
  113. return false;
  114. }
  115. return true;
  116. }
  117. //绘画图像
  118. bool CImageEx::DrawImage(CDC * pDC, INT nXPos, INT nYPos)
  119. {
  120. //加载判断
  121. ASSERT(m_pImage!=NULL);
  122. if (m_pImage==NULL) return false;
  123. //创建屏幕
  124. ASSERT(pDC!=NULL);
  125. Graphics graphics(pDC->GetSafeHdc());
  126. //获取属性
  127. INT nImageWidth=m_pImage->GetWidth();
  128. INT nImageHeight=m_pImage->GetHeight();
  129. //构造位置
  130. RectF rcDrawRect;
  131. rcDrawRect.X=(REAL)nXPos;
  132. rcDrawRect.Y=(REAL)nYPos;
  133. rcDrawRect.Width=(REAL)nImageWidth;
  134. rcDrawRect.Height=(REAL)nImageHeight;
  135. //绘画图像
  136. graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);
  137. return true;
  138. }
  139. //绘画图像
  140. bool CImageEx::DrawImage( CDC * pDC, INT nXPos, INT nYPos, INT nDestWidth, INT nDestHeight )
  141. {
  142. //加载判断
  143. ASSERT(m_pImage!=NULL);
  144. if (m_pImage==NULL) return false;
  145. //创建屏幕
  146. ASSERT(pDC!=NULL);
  147. Graphics graphics(pDC->GetSafeHdc());
  148. //构造位置
  149. RectF rcDrawRect;
  150. rcDrawRect.X=(REAL)nXPos;
  151. rcDrawRect.Y=(REAL)nYPos;
  152. rcDrawRect.Width=(REAL)nDestWidth;
  153. rcDrawRect.Height=(REAL)nDestHeight;
  154. //绘画图像
  155. graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
  156. return true;
  157. }
  158. //绘画图像
  159. bool CImageEx::DrawImage( CDC * pDC, RECT &rc )
  160. {
  161. //加载判断
  162. ASSERT(m_pImage!=NULL);
  163. if (m_pImage==NULL) return false;
  164. //创建屏幕
  165. ASSERT(pDC!=NULL);
  166. Graphics graphics(pDC->GetSafeHdc());
  167. //构造位置
  168. RectF rcDrawRect;
  169. rcDrawRect.X=(REAL)rc.left;
  170. rcDrawRect.Y=(REAL)rc.top;
  171. rcDrawRect.Width=(REAL)(rc.right-rc.left);
  172. rcDrawRect.Height=(REAL)(rc.bottom-rc.top);
  173. //绘画图像
  174. graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
  175. return true;
  176. }
  177. //绘画图像
  178. bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc)
  179. {
  180. //加载判断
  181. ASSERT(m_pImage!=NULL);
  182. if (m_pImage==NULL) return false;
  183. //创建屏幕
  184. ASSERT(pDC!=NULL);
  185. Graphics graphics(pDC->GetSafeHdc());
  186. //构造位置
  187. RectF rcDrawRect;
  188. rcDrawRect.X=(REAL)nXDest;
  189. rcDrawRect.Y=(REAL)nYDest;
  190. rcDrawRect.Width=(REAL)nDestWidth;
  191. rcDrawRect.Height=(REAL)nDestHeight;
  192. //绘画图像
  193. graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nDestWidth,(REAL)nDestHeight,UnitPixel);
  194. return true;
  195. }
  196. //绘画图像
  197. bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc, INT nSrcWidth, INT nSrcHeight)
  198. {
  199. //加载判断
  200. ASSERT(m_pImage!=NULL);
  201. if (m_pImage==NULL) return false;
  202. //创建屏幕
  203. ASSERT(pDC!=NULL);
  204. Graphics graphics(pDC->GetSafeHdc());
  205. //构造位置
  206. RectF rcDrawRect;
  207. rcDrawRect.X=(REAL)nXDest;
  208. rcDrawRect.Y=(REAL)nYDest;
  209. rcDrawRect.Width=(REAL)nDestWidth;
  210. rcDrawRect.Height=(REAL)nDestHeight;
  211. //绘画图像
  212. graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nSrcWidth,(REAL)nSrcHeight,UnitPixel);
  213. return true;
  214. }
  215. //混合绘画
  216. bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, BYTE cbAlphaDepth)
  217. {
  218. //透明绘画
  219. AlphaDrawImage(pDestDC,xDest,yDest,GetWidth(),GetHeight(),0,0,cbAlphaDepth);
  220. return true;
  221. }
  222. //混合绘画
  223. bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, BYTE cbAlphaDepth)
  224. {
  225. //加载判断
  226. ASSERT(m_pImage!=NULL);
  227. if (m_pImage==NULL) return false;
  228. //创建屏幕
  229. ASSERT(pDestDC!=NULL);
  230. Graphics graphics(pDestDC->GetSafeHdc());
  231. //构造位置
  232. RectF rcDrawRect;
  233. rcDrawRect.X=(REAL)xDest;
  234. rcDrawRect.Y=(REAL)yDest;
  235. rcDrawRect.Width=(REAL)cxDest;
  236. rcDrawRect.Height=(REAL)cyDest;
  237. //透明矩阵
  238. ColorMatrix Matrix=
  239. {
  240. 1.0f,0.0f,0.0f,0.0f,0.0f,
  241. 0.0f,1.0f,0.0f,0.0f,0.0f,
  242. 0.0f,0.0f,1.0f,0.0f,0.0f,
  243. 0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f,
  244. 0.0f,0.0f,0.0f,0.0f,1.0f
  245. };
  246. //设置属性
  247. ImageAttributes Attributes;
  248. Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
  249. //绘画图像
  250. graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxDest,(REAL)cyDest,UnitPixel,&Attributes);
  251. return true;
  252. }
  253. //混合绘画
  254. bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, BYTE cbAlphaDepth)
  255. {
  256. //创建缓冲
  257. if ((cxDest!=cxSrc)||(cyDest!=cySrc))
  258. {
  259. //加载判断
  260. ASSERT(m_pImage!=NULL);
  261. if (m_pImage==NULL) return false;
  262. //创建屏幕
  263. ASSERT(pDestDC!=NULL);
  264. Graphics graphics(pDestDC->GetSafeHdc());
  265. //构造位置
  266. RectF rcDrawRect;
  267. rcDrawRect.X=(REAL)xDest;
  268. rcDrawRect.Y=(REAL)yDest;
  269. rcDrawRect.Width=(REAL)cxDest;
  270. rcDrawRect.Height=(REAL)cyDest;
  271. //透明矩阵
  272. ColorMatrix Matrix=
  273. {
  274. 1.0f,0.0f,0.0f,0.0f,0.0f,
  275. 0.0f,1.0f,0.0f,0.0f,0.0f,
  276. 0.0f,0.0f,1.0f,0.0f,0.0f,
  277. 0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f,
  278. 0.0f,0.0f,0.0f,0.0f,1.0f
  279. };
  280. //设置属性
  281. ImageAttributes Attributes;
  282. Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
  283. //绘画图像
  284. graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxSrc,(REAL)cySrc,UnitPixel,&Attributes);
  285. }
  286. else
  287. {
  288. //普通调用
  289. AlphaDrawImage(pDestDC,xDest,yDest,cxDest,cyDest,xSrc,ySrc,cbAlphaDepth);
  290. }
  291. return true;
  292. }
  293. bool CImageEx::Draw( CDC * pDC, INT x, INT y, INT cx, INT cy,INT nLeft,INT nTop,INT nRight,INT nBottom )
  294. {
  295. int cxImage = GetWidth();
  296. int cyImage = GetHeight();
  297. // 左上
  298. {
  299. RECT rcDest = {x, y, x+nLeft, y+nTop};
  300. RECT rcSrc = {0, 0, nLeft, nTop};
  301. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  302. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  303. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  304. }
  305. // 左边
  306. {
  307. RECT rcDest = {x, y+nTop, x+nLeft, (y+nTop)+(cy-nTop-nBottom)};
  308. RECT rcSrc = {0, nTop, nLeft, nTop+(cyImage-nTop-nBottom)};
  309. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  310. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  311. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  312. }
  313. // 上边
  314. {
  315. RECT rcDest = {x+nLeft, y,x+(cx-nRight), y+nTop};
  316. RECT rcSrc = {nLeft, 0, (cxImage-nLeft-nRight), nTop};
  317. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  318. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  319. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  320. }
  321. // 右上
  322. {
  323. RECT rcDest = {x+(cx-nRight), y, (x+(cx-nRight))+nRight, y+nTop};
  324. RECT rcSrc = {cxImage-nRight, 0, (cxImage-nRight)+nRight, nTop};
  325. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  326. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  327. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  328. }
  329. // 右边
  330. {
  331. RECT rcDest = {x+(cx-nRight), y+nTop, (x+(cx-nRight))+nRight, (y+nTop)+(cy-nTop-nBottom)};
  332. RECT rcSrc = {cxImage-nRight, nTop, (cxImage-nRight)+nRight, nTop+(cyImage-nTop-nBottom)};
  333. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  334. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  335. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  336. }
  337. // 下边
  338. {
  339. RECT rcDest = {x+nLeft, y+(cy-nBottom), (x+nLeft)+(cx-nLeft-nRight), (y+(cy-nBottom))+nBottom};
  340. RECT rcSrc = {nLeft, cyImage-nBottom, nLeft+(cxImage-nLeft-nRight), (cyImage-nBottom)+nBottom};
  341. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  342. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  343. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  344. }
  345. // 右下
  346. {
  347. RECT rcDest = {x+(cx-nRight), y+(cy-nBottom), (x+(cx-nRight))+nRight, (y+(cy-nBottom))+nBottom};
  348. RECT rcSrc = {cxImage-nRight, cyImage-nBottom, (cxImage-nRight)+nRight, (cyImage-nBottom)+nBottom};
  349. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  350. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  351. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  352. }
  353. // 左下
  354. {
  355. RECT rcDest = {x, y+(cy-nBottom), x+nLeft, (y+(cy-nBottom))+nBottom};
  356. RECT rcSrc = {0, cyImage-nBottom, nLeft, (cyImage-nBottom)+nBottom};
  357. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  358. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  359. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  360. }
  361. // 中间
  362. {
  363. RECT rcDest = {x+nLeft, y+nTop, x+(cx-nRight), y+(cy-nBottom)};
  364. RECT rcSrc = {nLeft, nTop, cxImage-nRight, cyImage-nBottom};
  365. if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
  366. DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
  367. rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
  368. }
  369. return TRUE;
  370. }
  371. bool CImageEx::Draw( CDC * pDC, const RECT& rectDest, const RECT& rectSrc )
  372. {
  373. return Draw(pDC,rectDest.left, rectDest.top, rectDest.right-rectDest.left, rectDest.bottom-rectDest.top,
  374. rectSrc.left, rectSrc.top,rectSrc.right, rectSrc.bottom);
  375. }
  376. bool CImageEx::Draw( CDC * pDC, const RECT& rectDest )
  377. {
  378. return Draw(pDC,rectDest,m_rcNinePart);
  379. }
  380. void CImageEx::SetNinePart( CONST LPRECT lprcNinePart )
  381. {
  382. if( lprcNinePart == NULL ) return;
  383. ::CopyRect(&m_rcNinePart,lprcNinePart);
  384. }
  385. HBITMAP CImageEx::ImageToBitmap(/*HDC hDC*/)
  386. {
  387. ASSERT(m_pImage != NULL);
  388. if(m_pImage == NULL) return NULL;
  389. // INT nHeight = GetHeight();
  390. // INT nWidth = GetWidth();
  391. //
  392. // if (nWidth <= 0 || nHeight <= 0)
  393. // {
  394. // return NULL;
  395. // }
  396. //
  397. // BITMAPINFO bmpInfo;
  398. // bmpInfo.bmiHeader.biHeight = -(LONG)nHeight;
  399. // bmpInfo.bmiHeader.biWidth = nWidth;
  400. // bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  401. // bmpInfo.bmiHeader.biPlanes = 1;
  402. // bmpInfo.bmiHeader.biBitCount = 32;
  403. // bmpInfo.bmiHeader.biCompression = BI_RGB;
  404. // bmpInfo.bmiHeader.biSizeImage = 0;
  405. // bmpInfo.bmiHeader.biXPelsPerMeter = 0;
  406. // bmpInfo.bmiHeader.biYPelsPerMeter = 0;
  407. // bmpInfo.bmiHeader.biClrUsed = 0;
  408. // bmpInfo.bmiHeader.biClrImportant = 0;
  409. //
  410. // BYTE* pbase = NULL;
  411. // HBITMAP hBitmap = ::CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&pbase, 0, 0);
  412. //
  413. // if (!hBitmap) return NULL;
  414. //
  415. // return hBitmap;
  416. m_pImage->GetHBITMAP(Color(0,0,0),&m_hBitmap);
  417. return m_hBitmap;
  418. }
  419. bool CImageEx::DrawExtrude( CDC*pDC,const RECT& rectDest,bool bLeft,int nPixel )
  420. {
  421. //加载判断
  422. ASSERT(m_pImage!=NULL);
  423. if (m_pImage==NULL) return false;
  424. //创建屏幕
  425. ASSERT(pDC!=NULL);
  426. Graphics graphics(pDC->GetSafeHdc());
  427. int nWidth = rectDest.right - rectDest.left;
  428. int nHeight = rectDest.bottom - rectDest.top;
  429. if ( bLeft )
  430. {
  431. DrawImage(pDC,rectDest.left,rectDest.top);
  432. if(nWidth>GetWidth())
  433. DrawImage(pDC,GetWidth(),rectDest.top,(nWidth-GetWidth()),GetHeight(),GetWidth()-nPixel,0,nPixel,GetHeight());
  434. }
  435. else
  436. {
  437. if ( nWidth <=GetWidth() )
  438. {
  439. DrawImage(pDC,rectDest.left,rectDest.top,nWidth,GetHeight(),GetWidth()-nWidth,0,nWidth,GetHeight());
  440. }
  441. else
  442. {
  443. DrawImage(pDC,rectDest.left,rectDest.top,nWidth-GetWidth(),GetHeight(),nPixel,0,nPixel,GetHeight());
  444. DrawImage(pDC,nWidth-GetWidth(),rectDest.top);
  445. }
  446. }
  447. return true;
  448. }
  449. bool CImageEx::SetGray()
  450. {
  451. //加载判断
  452. ASSERT(m_pImage!=NULL);
  453. if (m_pImage==NULL) return false;
  454. UINT nWidth = GetWidth();
  455. UINT nHeight = GetHeight();
  456. BitmapData bmpData;
  457. Rect rect(0, 0, nWidth, nHeight);
  458. m_pImage->LockBits(&rect, Gdiplus::ImageLockModeRead|Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &bmpData);
  459. int nValue = 0;
  460. BYTE * pArray = (BYTE *)bmpData.Scan0;
  461. UINT nBytes = (UINT)((nWidth * nHeight) << 2);
  462. for (UINT i = 0; i < nBytes; i += 4)
  463. {
  464. nValue = (int)(pArray[i] * 0.1 + pArray[i+1] * 0.2 + pArray[i+2] * 0.7);
  465. pArray[i] = nValue;
  466. pArray[i+1] = nValue;
  467. pArray[i+2] = nValue;
  468. }
  469. m_pImage->UnlockBits(&bmpData);
  470. return true;
  471. }
  472. //////////////////////////////////////////////////////////////////////////////////