现在的位置: 首页 > 综合 > 正文

实现彩色图片到灰色图片的转换

2014年01月09日 ⁄ 综合 ⁄ 共 1908字 ⁄ 字号 评论关闭

实现彩色图片到单色位图转换的方法是先获取CMyListCtrl的ImageList 并提取ListCtrl中
的Item 对应的图像后,用代码转换成单色位图并在原位置显示。转换过程如下:

CImageList* pImageList=NULL;
pImageList = GetImageList(LVSIL_SMALL);
if(pImageList !=NULL)
{
 HICON hIcon=NULL;                  
 hIcon = pImageList->ExtractIcon(nItem);
 HBITMAP  hbitmap,hBitmapMask; 
 ICONINFO* iconinfo = new ICONINFO;                   
 if(::GetIconInfo(hIcon, iconinfo))
 {
  hbitmap   =   iconinfo->hbmColor;                    
  hBitmapMask = iconinfo->hbmMask;
  if (!(nStyle & TVS_ONLINEUSER))
   //hbitmap = BitmapColorToGray(m_hDll,&memDC,hbitmap);                        
   hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);
  DrawBitmap(m_hDll, &memDC,hbitmap,rcIcon);
  DeleteObject(hbitmap);
  DeleteObject(hBitmapMask);
 }
 delete iconinfo;
 ::DestroyIcon(hIcon);
}
实现彩色图片到单色位图转换的语句为:hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);

写了一个实现彩色图片到单色位图转换算法,其代码如下:
 //这是本人写的一个转换算法。效果好,但运行时间稍长
HBITMAP BitmapColorToGray(CDC* pDC,HBITMAP hBitmap)
{
      BITMAP bmpInfo;

      ::GetObject(hBitmap,sizeof(BITMAP),&bmpInfo);

      if(pDC)
      {
            CDC memDC;

            if( !memDC.CreateCompatibleDC(pDC) )
            {
                  return NULL;
            }

            HBITMAP oldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);

            DWORD   r,g,b;  

            for (int H =0; H <= bmpInfo.bmHeight; H++)  
            {
                  for(int W = 0; W <= bmpInfo.bmWidth; W ++)  
                  {  
                        r = GetRValue(memDC.GetPixel(W,H));  
                        g = GetGValue(memDC.GetPixel(W,H));  
                        b = GetBValue(memDC.GetPixel(W,H));  
                        r = (r * 3 + g * 6 +  g) / 10;  
                        g   =   r;  
                        b   =   g;  
                        memDC.SetPixel(CPoint(W,H),RGB(r,g,b));
                  }
            }

            hBitmap = (HBITMAP)memDC.SelectObject(oldBitmap);

            memDC.DeleteDC();
      }

    return hBitmap;          
}

 

抱歉!评论已关闭.