请高手指点-Win98下如何在画位图时,去掉位图的背景。

时间:2020-12-29 04:58:32
在Win98下如何在画位图时,去掉位图的背景。
我试了BltBit函数,好象没有这个功能。
请各位高手指点。

6 个解决方案

#1


位图没有背景概念,位图只是一个点和颜色的整体。
如果你知道如何判断什么是背景,比如所有的白点,那你自己根据这个位图生成一
个Mask位图,用这个Mask位图和原位图一起用位方式贴图,就能达到去背景的效果。

#2


灰色是windows的永恒背景色,在画位图是,想办法把位图的底色调为灰色RGB(192,192,192)

这样位图就会适应不同的背景色,好像背景被设为透明一样.

#3


请问LiOmin:
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?

问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。

#4


推荐《windows程序设计》Charles Petzold著
唉,说什么呢
windows程序员的工具书,不可不放一本在身边

#5


void DrawTransparentBitmap(HDC hDC,PDIB pDibFore,HDC hBack,
    int dx,int dy,int w,int h,int BackOrgX,int BackOrgY)
{

    int             col,row ;
    LPSTR           lpForeBits ;

    if (DibBitCount(pDibFore) != 8 ) return ;

  //  DibMapToPalette(pDibFore,hpal) ;

    lpForeBits = (LPSTR)DibPtr(pDibFore) ;

    PDIB pDibXOR = (PDIB)DibCreate(DibBitCount(pDibFore),
                    pDibFore->biWidth,pDibFore->biHeight) ;
    memcpy((char *)pDibXOR,(char *)pDibFore,DibSize(pDibFore)) ;

    RGBQUAD FAR *   lpRGBQuad = DibColors(pDibXOR) ;
    int     i ;
    bool    bFound = false ;
    for (i = 0 ; i < 256 ; i ++) {
        if ((lpRGBQuad[i].rgbBlue == GetBValue(TRANSPARENTCOLOR)) &&
            (lpRGBQuad[i].rgbGreen == GetGValue(TRANSPARENTCOLOR)) &&
            (lpRGBQuad[i].rgbRed == GetRValue(TRANSPARENTCOLOR))) {
                bFound = true ;
                lpRGBQuad[i].rgbBlue = 0 ;
                lpRGBQuad[i].rgbGreen = 0 ;
                lpRGBQuad[i].rgbRed = 0 ;
                break ;
            }
    }
    if (!bFound) {
        DrawDib(hDC,pDibFore,0,0,w,h) ;
        DibFree(pDibXOR) ;
        return ;
    }
    PDIB pDib = (PDIB)DibCreate(DibBitCount(pDibXOR),
                    pDibXOR->biWidth,pDibXOR->biHeight) ;
    if (!pDib) {
        DibFree(pDibXOR) ;
        return ;
    }

    memcpy((char *)pDib,(char *)pDibXOR,DibSize(pDibXOR)) ;
    lpRGBQuad[i].rgbBlue = 255 ;
    lpRGBQuad[i].rgbGreen = 255 ;
    lpRGBQuad[i].rgbRed = 255 ;

    HDC             hMemDC ;
    HBITMAP         hbmp,hold ;
    int             left,top ;

    SetStretchBltMode(hDC,HALFTONE) ;
    left = abs(dx - BackOrgX) ;
    top = abs(dy - BackOrgY) ;
    BitBlt(hDC,0,0,w,h,hBack,left,top,SRCCOPY) ;

    hMemDC = CreateCompatibleDC(hDC) ;
    hbmp = CreateCompatibleBitmap(hDC,pDib->biWidth,pDib->biHeight) ;

    SetDIBits(hMemDC, hbmp, 0, pDib->biHeight,
        (LPBYTE)DibPtr(pDib), (LPBITMAPINFO)pDib, DIB_RGB_COLORS) ;
    hold = SelectObject(hMemDC,hbmp) ;
    StretchBlt(hDC,0,0,w,h,hMemDC,0,0,pDib->biWidth,pDib->biHeight,SRCPAINT) ;
    SetDIBits(hMemDC, hbmp, 0, pDibXOR->biHeight,
        (LPBYTE)DibPtr(pDibXOR), (LPBITMAPINFO)pDibXOR, DIB_RGB_COLORS) ;
    StretchBlt(hDC,0,0,w,h,hMemDC,0,0,pDibXOR->biWidth,pDibXOR->biHeight,SRCAND) ;

    SelectObject(hMemDC,hold) ;
    DeleteObject(hbmp) ;
    DeleteDC(hMemDC) ;

    DibFree(pDib) ;
    DibFree(pDibXOR) ;
}

void DrawDib(HDC hDC,PDIB pDib,int x,int y,int w,int h)
{
    HDC             hMemDC ;
    HBITMAP         hbmp,hold ;

    hMemDC = CreateCompatibleDC(hDC) ;
    hbmp = CreateCompatibleBitmap(hDC,pDib->biWidth,pDib->biHeight) ;
    SetDIBits(hMemDC, hbmp, 0, pDib->biHeight,
        (LPBYTE)DibPtr(pDib), (LPBITMAPINFO)pDib, DIB_RGB_COLORS) ;
    hold = SelectObject(hMemDC,hbmp) ;
    SetStretchBltMode(hDC,COLORONCOLOR) ;
    StretchBlt(hDC,x,y,w,h,hMemDC,0,0,pDib->biWidth,pDib->biHeight,SRCCOPY) ;

    SelectObject(hMemDC,hold) ;
    DeleteObject(hbmp) ;
    DeleteDC(hMemDC) ;
}

#6


谢谢各位指教!
有没有其他人回答了。我马上给分了。

#1


位图没有背景概念,位图只是一个点和颜色的整体。
如果你知道如何判断什么是背景,比如所有的白点,那你自己根据这个位图生成一
个Mask位图,用这个Mask位图和原位图一起用位方式贴图,就能达到去背景的效果。

#2


灰色是windows的永恒背景色,在画位图是,想办法把位图的底色调为灰色RGB(192,192,192)

这样位图就会适应不同的背景色,好像背景被设为透明一样.

#3


请问LiOmin:
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?

问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。

#4


推荐《windows程序设计》Charles Petzold著
唉,说什么呢
windows程序员的工具书,不可不放一本在身边

#5


void DrawTransparentBitmap(HDC hDC,PDIB pDibFore,HDC hBack,
    int dx,int dy,int w,int h,int BackOrgX,int BackOrgY)
{

    int             col,row ;
    LPSTR           lpForeBits ;

    if (DibBitCount(pDibFore) != 8 ) return ;

  //  DibMapToPalette(pDibFore,hpal) ;

    lpForeBits = (LPSTR)DibPtr(pDibFore) ;

    PDIB pDibXOR = (PDIB)DibCreate(DibBitCount(pDibFore),
                    pDibFore->biWidth,pDibFore->biHeight) ;
    memcpy((char *)pDibXOR,(char *)pDibFore,DibSize(pDibFore)) ;

    RGBQUAD FAR *   lpRGBQuad = DibColors(pDibXOR) ;
    int     i ;
    bool    bFound = false ;
    for (i = 0 ; i < 256 ; i ++) {
        if ((lpRGBQuad[i].rgbBlue == GetBValue(TRANSPARENTCOLOR)) &&
            (lpRGBQuad[i].rgbGreen == GetGValue(TRANSPARENTCOLOR)) &&
            (lpRGBQuad[i].rgbRed == GetRValue(TRANSPARENTCOLOR))) {
                bFound = true ;
                lpRGBQuad[i].rgbBlue = 0 ;
                lpRGBQuad[i].rgbGreen = 0 ;
                lpRGBQuad[i].rgbRed = 0 ;
                break ;
            }
    }
    if (!bFound) {
        DrawDib(hDC,pDibFore,0,0,w,h) ;
        DibFree(pDibXOR) ;
        return ;
    }
    PDIB pDib = (PDIB)DibCreate(DibBitCount(pDibXOR),
                    pDibXOR->biWidth,pDibXOR->biHeight) ;
    if (!pDib) {
        DibFree(pDibXOR) ;
        return ;
    }

    memcpy((char *)pDib,(char *)pDibXOR,DibSize(pDibXOR)) ;
    lpRGBQuad[i].rgbBlue = 255 ;
    lpRGBQuad[i].rgbGreen = 255 ;
    lpRGBQuad[i].rgbRed = 255 ;

    HDC             hMemDC ;
    HBITMAP         hbmp,hold ;
    int             left,top ;

    SetStretchBltMode(hDC,HALFTONE) ;
    left = abs(dx - BackOrgX) ;
    top = abs(dy - BackOrgY) ;
    BitBlt(hDC,0,0,w,h,hBack,left,top,SRCCOPY) ;

    hMemDC = CreateCompatibleDC(hDC) ;
    hbmp = CreateCompatibleBitmap(hDC,pDib->biWidth,pDib->biHeight) ;

    SetDIBits(hMemDC, hbmp, 0, pDib->biHeight,
        (LPBYTE)DibPtr(pDib), (LPBITMAPINFO)pDib, DIB_RGB_COLORS) ;
    hold = SelectObject(hMemDC,hbmp) ;
    StretchBlt(hDC,0,0,w,h,hMemDC,0,0,pDib->biWidth,pDib->biHeight,SRCPAINT) ;
    SetDIBits(hMemDC, hbmp, 0, pDibXOR->biHeight,
        (LPBYTE)DibPtr(pDibXOR), (LPBITMAPINFO)pDibXOR, DIB_RGB_COLORS) ;
    StretchBlt(hDC,0,0,w,h,hMemDC,0,0,pDibXOR->biWidth,pDibXOR->biHeight,SRCAND) ;

    SelectObject(hMemDC,hold) ;
    DeleteObject(hbmp) ;
    DeleteDC(hMemDC) ;

    DibFree(pDib) ;
    DibFree(pDibXOR) ;
}

void DrawDib(HDC hDC,PDIB pDib,int x,int y,int w,int h)
{
    HDC             hMemDC ;
    HBITMAP         hbmp,hold ;

    hMemDC = CreateCompatibleDC(hDC) ;
    hbmp = CreateCompatibleBitmap(hDC,pDib->biWidth,pDib->biHeight) ;
    SetDIBits(hMemDC, hbmp, 0, pDib->biHeight,
        (LPBYTE)DibPtr(pDib), (LPBITMAPINFO)pDib, DIB_RGB_COLORS) ;
    hold = SelectObject(hMemDC,hbmp) ;
    SetStretchBltMode(hDC,COLORONCOLOR) ;
    StretchBlt(hDC,x,y,w,h,hMemDC,0,0,pDib->biWidth,pDib->biHeight,SRCCOPY) ;

    SelectObject(hMemDC,hold) ;
    DeleteObject(hbmp) ;
    DeleteDC(hMemDC) ;
}

#6


谢谢各位指教!
有没有其他人回答了。我马上给分了。