ImageEx.cpp 14 KB

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