请问怎么样去除位图的背景色(100分)

  • 主题发起人 davidbeckham
  • 开始时间
D

davidbeckham

Unregistered / Unconfirmed
GUEST, unregistred user!
function TransparentStretchBlt(DstDC: HDC;
DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC;
SrcX, SrcY, SrcW, SrcH: Integer;
MaskDC: HDC;
MaskX,
MaskY: Integer): Boolean;
const
ROP_DstCopy = $00AA0029;
var
MemDC: HDC;
MemBmp: HBITMAP;
Save: THandle;
crText, crBack: TColorRef;
SavePal: HPALETTE;
begin
Result := True;
if (Win32Platform = VER_PLATFORM_WIN32_NT) and (SrcW = DstW) and (SrcH = DstH) then
begin
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, 1, 1));
MemBmp := SelectObject(MaskDC, MemBmp);
try
MaskBlt(DstDC, DstX, DstY, DstW, DstH, SrcDC, SrcX, SrcY, MemBmp, MaskX,
MaskY, MakeRop4(ROP_DstCopy, SrcCopy));
finally
MemBmp := SelectObject(MaskDC, MemBmp);
DeleteObject(MemBmp);
end;
Exit;
end;
SavePal := 0;
MemDC := GDICheck(CreateCompatibleDC(0));
try
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, SrcW, SrcH));
Save := SelectObject(MemDC, MemBmp);
SavePal := SelectPalette(SrcDC, SystemPalette16, False);
SelectPalette(SrcDC, SavePal, False);
if SavePal <> 0 then
SavePal := SelectPalette(MemDC, SavePal, True)
else
SavePal := SelectPalette(MemDC, SystemPalette16, True);
RealizePalette(MemDC);
StretchBlt(MemDC, 0, 0, SrcW, SrcH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcCopy);
StretchBlt(MemDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SrcW, SrcH, SrcErase);
crText := SetTextColor(DstDC, $0);
crBack := SetBkColor(DstDC, $FFFFFF);
StretchBlt(DstDC, DstX, DstY, DstW, DstH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcAnd);
StretchBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0, SrcW, SrcH, SrcInvert);
SetTextColor(DstDC, crText);
SetBkColor(DstDC, crBack);
if Save <> 0 then
SelectObject(MemDC, Save);
DeleteObject(MemBmp);
finally
if SavePal <> 0 then
SelectPalette(MemDC, SavePal, False);
DeleteDC(MemDC);
end;
end;

请问TransparentStretchBlt函数的中各个参数应该怎样取,我在VC中想实现去除位图的背景色,好不容易找到这段DELPHI代码,可是里面的参数设置不清楚,请知道的大虾说的详细点,顺便贴出用VC实现的代码,谢谢了!
 
这是Delphi的Graphics单元中的代码。你是要显示透明位图吗?如果是那也不能叫去掉透
明色呀!袁枫的书中有非常详细的C/C++代码。如果你要他的代码我可以给你。关于显示透
明位图他讲得实在是精彩!实在是精彩呀!
 
直接用这个函数吧:
假设有位图A,把去掉背景后的图存到位图B,去掉的背景是白色:
TransparentBlt(B.Canvas.Handle, 0, 0, A.Width, A.Height,
B.Canvas.Handle, 0, 0, A.Width, B.Height, RGB($FF, $FF, $FF));
 
顺便说一下,袁枫全书的代码好象源码空间上有。
 
barton, 文章past给我一份吧:)
xbeta#163(dot)net
 
~~他要VC的实现代码~~
 
不是文章,是书。我不知道怎么post呀!EMS?~_~
如果你要源码我可以Post给你,不知道你邮箱够不够大?(14M+)
ftp://guest:guestguest@61.129.70.192/datanew/200306231912304429.rar
 
BARTON:
给我发一份吧,我的邮箱是z.w.xiong@163.com
谢谢了
 
怎么啦?上面的URL下载不了?你的邮箱不够大呀兄弟?
 
我下载了,正在里面有很多例子,不知道是哪个?
 
等我分析完成,解决了问题立刻给分:)
 
在第11章的第二节。有三个透明位图函数。
如果你经常搞图形编程我建议你去买一本,你一定不会失望。
 
呵呵,我这些天没什么时间去,以后再向你讨教,先把分给你了,呵呵
你有邮箱吗,以后多联系,我的是z.w.xiong@163.com qq:51929725
 
多人接受答案了。
 
顶部