最近开始学习dx,试着做一些小的程序来练习的时候发现一个问题,那就是如何把一个图片导入面后blt到其他面的时候只保留该图片中的单色相素,其他颜色的相素都以透明化处理;还忘这方面的前辈们指点一二,十分感谢!

解决方案 »

  1.   

    你在BitBlt的时候可以制定透明色,但看你的要求是要把透明色显示而其他的都不要?那可以用一张MASK图来解决
      

  2.   

    maxying老兄说的正是我想要实现的,还请说明白点,小弟刚刚接触到dx。很多东西不太清楚
    谢谢
      

  3.   

    http://media.ccidnet.com/media/ciw/1059/b1201.htm
      

  4.   

    一些不错的资料
    http://www.ittide.com/document/article/graphic/
      

  5.   

    绘制透明位图
      在丰富多彩的软件世界中,位图的处理技术尤为重要。透明位图的显示作为
    一种常用的图像处理方法,被用在众多的软件中。其基本原理,也就是将一幅需
    要透明显示的位图(其透明色为已知),制作出二幅需要的位图A与B,其中A为除
    透明色外均填充为黑色,B为把透明色填充为黑色其余色不变,再用指定光栅操作
    将两幅位图合并,可形成透明位图。
    创建过程如下:
    1、使用透明色背景,将位图拷贝到内存屏蔽位图中。
    2、利用与白色相与不变色,与黑色相与成黑色的原理,将内存位图的的背景设置
    成黑色、前景设置成白色,并将屏蔽位图用与操作拷贝到此内存位图中。形成位图B。
    3、将显示设备背景设置为白色、前景设置成黑色,并将屏蔽位图用与操作拷贝到
    显示设备中。形成位图A。
    4、将内存位图用或操作拷贝到显示设备中。最终形成透明位图。
    //参数说明:
    //hDIB -位图句柄
    //pPal -位图调色板
    //xDest -显示位图的左上角x坐标
    //yDest -显示位图的左上角y坐标
    //colorTransparent -透明色
    void DrawTransparentBitmap( CDC *pDC, int nXDest, int nYDest,HGLOBAL hDIB, COLORREF colorTransparent, CPalette *pPal)
    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
    int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
    1 << bmInfo.bmiHeader.biBitCount;
    int nWidth = bmInfo.bmiHeader.biWidth;
    int nHeight = bmInfo.bmiHeader.biHeight;
    LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
    CDC memDC,maskDC;
    memDC.CreateCompatibleDC( pDC );
    CBitmap bmp;
    bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
    CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
    if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
    CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
    memDC.RealizePalette();
    ::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
    nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
    maskDC.CreateCompatibleDC(pDC);
    CBitmap maskBitmap;
    maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
    maskDC.SelectObject( &maskBitmap );
    memDC.SetBkColor( colorTransparent );
    maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY );
    memDC.SetBkColor(RGB(0,0,0));
    memDC.SetTextColor(RGB(255,255,255));
    memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
    pDC->SetBkColor(RGB(255,255,255));
    pDC->SetTextColor(RGB(0,0,0));
    pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
     
    pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,
    0, 0, SRCPAINT);
    memDC.SelectObject( pOldBitmap );