我有一张图片,它的底色是粉红色,(其实粉红色就是我所说的透明色),
我现在想在DC上操作,怎么可以去除粉红色,而图片的其他内容全部保持不变!

解决方案 »

  1.   

    使用CDC类的函数
    BOOL TransparentBlt(
       int xDest,
       int yDest,
       int nDestWidth,
       int nDestHeight,
       CDC* pSrcDC,
       int xSrc,
       int ySrc,
       int nSrcWidth,
       int nSrcHeight,
       UINT clrTransparent //透明色
    );
      

  2.   

    可以。不过复杂一点,用透明色&源图得到镂空轮廓,将透明色替换成白色,然后与目的图与可以将目的图挖出一个轮廓,然后将源图异或到目的图上。
      

  3.   

    TransparentBlt在Win98以上就可以用了,方便简单,何必自己做。
      

  4.   

    本人想知道些原理,折腾了老半天拉!to ddmor(小明) :
    那么在DC操作中,怎么实现将透明色替换成白色(我指的是不用像素级的操作哦),盼答复!!!
      

  5.   

    给你个函数,自己研究,呵呵----------------------------------------------------------------------------
    /*用于没有掩码图,只有指定透明色,可以进行伸缩*/
    void CCommon::DrawTransBitmap( HDC hdcDest,      // 目标DC
     int nXOriginDest,   // 目标X偏移
     int nYOriginDest,   // 目标Y偏移
     int nWidthDest,     // 目标宽度
     int nHeightDest,    // 目标高度
     HDC hdcSrc,         // 源DC
     int nXOriginSrc,    // 源X起点
     int nYOriginSrc,    // 源Y起点
     int nWidthSrc,      // 源宽度
     int nHeightSrc,     // 源高度
     UINT crTransparent  // 透明色,COLORREF类型
     )
    {
    HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
    HDC hImageDC = CreateCompatibleDC(hdcDest);
    HDC hMaskDC = CreateCompatibleDC(hdcDest);
    hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
    hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

    // 将源DC中的位图拷贝到临时DC中
    if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
    else
    StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, 
    hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

    // 设置透明色
    SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图
    BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

    // 生成透明区域为黑色,其它区域保持不变的位图
    SetBkColor(hImageDC, RGB(0,0,0));
    SetTextColor(hImageDC, RGB(255,255,255));
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色
    SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
    SetTextColor(hdcDest,RGB(0,0,0));
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // "或"运算,生成最终效果
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC, hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);

    }
      

  6.   

    ImageList_LoadImage
    ImageList_DrawIndirect