我试了BltBit函数,好象没有这个功能。
请各位高手指点。
6 个解决方案
#1
位图没有背景概念,位图只是一个点和颜色的整体。
如果你知道如何判断什么是背景,比如所有的白点,那你自己根据这个位图生成一
个Mask位图,用这个Mask位图和原位图一起用位方式贴图,就能达到去背景的效果。
如果你知道如何判断什么是背景,比如所有的白点,那你自己根据这个位图生成一
个Mask位图,用这个Mask位图和原位图一起用位方式贴图,就能达到去背景的效果。
#2
灰色是windows的永恒背景色,在画位图是,想办法把位图的底色调为灰色RGB(192,192,192)
这样位图就会适应不同的背景色,好像背景被设为透明一样.
这样位图就会适应不同的背景色,好像背景被设为透明一样.
#3
请问LiOmin:
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?
问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?
问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。
#4
推荐《windows程序设计》Charles Petzold著
唉,说什么呢
windows程序员的工具书,不可不放一本在身边
唉,说什么呢
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) ;
}
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位图和原位图一起用位方式贴图,就能达到去背景的效果。
如果你知道如何判断什么是背景,比如所有的白点,那你自己根据这个位图生成一
个Mask位图,用这个Mask位图和原位图一起用位方式贴图,就能达到去背景的效果。
#2
灰色是windows的永恒背景色,在画位图是,想办法把位图的底色调为灰色RGB(192,192,192)
这样位图就会适应不同的背景色,好像背景被设为透明一样.
这样位图就会适应不同的背景色,好像背景被设为透明一样.
#3
请问LiOmin:
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?
问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。
如何生成一个位图的Mask位图。能不能给我个具体的代码。
假如我有一个HBITMAP hbt 句柄指向一个位图。我想去掉这个位图的白色部分。如何做,谢谢指教,一定给分。
顺便问一下,在98下,TransparentBlt()函数明明说明可以去掉指定的颜色,但我却编译通不过,我已经包含了wingdi.h头文件。请问应该怎么做?
问一下wljsky灰色是永恒的背景色,我把位图上想去掉的颜色改为灰色,然后画到兰色窗体上,位图的灰色部分不会遮住窗体兰色吗?我想试一试。
#4
推荐《windows程序设计》Charles Petzold著
唉,说什么呢
windows程序员的工具书,不可不放一本在身边
唉,说什么呢
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) ;
}
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
谢谢各位指教!
有没有其他人回答了。我马上给分了。
有没有其他人回答了。我马上给分了。