不用转为Bitmap,在兼容DC里绘制后再通过算法转为灰度图,网上都有现成的算法了

解决方案 »

  1.   

    想问问楼主和1# 2#,为啥要把List Control中显示的图标显示为灰色呢,在Windows下好像没见过这种实例啊。灰色一般不是都用来表示不可用吗?
      

  2.   

    HICON转成HBITMAP
    GetIconInfo()/CopyImage(info.hbmColor, IMAGE_BITMAP,...);
      

  3.   

    http://www.cnblogs.com/tingshuo/archive/2011/05/16/2047797.html
      

  4.   

    GID+
    用GDI+估计几行代码吧 效果如何 就没试验过了
    关键代码
    Bitmap *pBmp = Bitmap::FromHICON(hIcon);
    ImageAttributes imAtt;
    imAtt.SetOutputChannel( ColorChannelFlagsK, ColorAdjustTypeDefault);Graphics g(pBmp);
    pg->DrawImage( pBmp, RectF(0,0,pBmp->GetWidth(),pBmp->GetHeight()) ,0, 0,
    pBmp->GetWidth(), 
    pBmp->GetHeight(), 
    UnitPixel, &imAtt );
    以上代码获得的pBmp为灰度图
    在使用CreateIcon获得灰图标
      

  5.   

    尝试了上述各位的建议,没有成功 ,使用灰度图算法好像很麻烦 暂时不会用GDI+进行开发
      

  6.   

    https://github.com/zhaolili/ImageMatchOnSIFT/blob/master/IMAGEMATCHOnSIFTDlg.cpp
      

  7.   

    已解决图标变灰的问题, 参见 http://www.codeproject.com/Articles/18636/CreateGrayscaleIcon-which-supports-24-and-32-bpp-i其代码如下:
    #ifndef _CREATEGRAYSCALEICON_H
    #define _CREATEGRAYSCALEICON_HCOLORREF defaultGrayPalette[256];
    BOOL bGrayPaletteSet = FALSE;HICON CreateGrayscaleIcon( HICON hIcon, COLORREF* pPalette )
    {
    if (hIcon == NULL)
    {
    return NULL;
    } HDC hdc = ::GetDC(NULL); HICON      hGrayIcon      = NULL;
    ICONINFO   icInfo         = { 0 };
    ICONINFO   icGrayInfo     = { 0 };
    LPDWORD    lpBits         = NULL;
    LPBYTE     lpBitsPtr      = NULL;
    SIZE sz;
    DWORD c1 = 0;
    BITMAPINFO bmpInfo        = { 0 };
    bmpInfo.bmiHeader.biSize  = sizeof(BITMAPINFOHEADER); if (::GetIconInfo(hIcon, &icInfo))
    {
    if (::GetDIBits(hdc, icInfo.hbmColor, 0, 0, NULL, &bmpInfo, DIB_RGB_COLORS) != 0)
    {
    bmpInfo.bmiHeader.biCompression = BI_RGB; sz.cx = bmpInfo.bmiHeader.biWidth;
    sz.cy = bmpInfo.bmiHeader.biHeight;
    c1 = sz.cx * sz.cy; lpBits = (LPDWORD)::GlobalAlloc(GMEM_FIXED, (c1) * 4); if (lpBits && ::GetDIBits(hdc, icInfo.hbmColor, 0, sz.cy, lpBits, &bmpInfo, DIB_RGB_COLORS) != 0)
    {
    lpBitsPtr     = (LPBYTE)lpBits;
    UINT off      = 0; for (UINT i = 0; i < c1; i++)
    {
    off = (UINT)( 255 - (( lpBitsPtr[0] + lpBitsPtr[1] + lpBitsPtr[2] ) / 3) ); if (lpBitsPtr[3] != 0 || off != 255)
    {
    if (off == 0)
    {
    off = 1;
    } lpBits[i] = pPalette[off] | ( lpBitsPtr[3] << 24 );
    } lpBitsPtr += 4;
    } icGrayInfo.hbmColor = ::CreateCompatibleBitmap(hdc, sz.cx, sz.cy); if (icGrayInfo.hbmColor != NULL)
    {
    ::SetDIBits(hdc, icGrayInfo.hbmColor, 0, sz.cy, lpBits, &bmpInfo, DIB_RGB_COLORS); icGrayInfo.hbmMask = icInfo.hbmMask;
    icGrayInfo.fIcon   = TRUE; hGrayIcon = ::CreateIconIndirect(&icGrayInfo); ::DeleteObject(icGrayInfo.hbmColor);
    } ::GlobalFree(lpBits);
    lpBits = NULL;
    }
    } ::DeleteObject(icInfo.hbmColor);
    ::DeleteObject(icInfo.hbmMask);
    } ::ReleaseDC(NULL,hdc); return hGrayIcon;
    }HICON CreateGrayscaleIcon( HICON hIcon )
    {
    if (hIcon == NULL)
    {
    return NULL;
    } if (!bGrayPaletteSet)
    {
    for(int i = 0; i < 256; i++)
    {
    defaultGrayPalette[i] = RGB(255-i, 255-i, 255-i);
    } bGrayPaletteSet = TRUE;
    } return CreateGrayscaleIcon(hIcon, defaultGrayPalette);
    }
    #endif