delphi 中如何让图片的背景是透明色的 delphi 中如何让图片的背景是透明色的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用Png图片,可以设置png图片的透明度(不知道这个答案是否是你需要的) 如果没alpha就初始化alpha然后把alpha设置个透明值 先进行异或运算,把背景色变透明并在背景上挖出一个黑轮廓,然后再把原图跟背景进行与运算就贴上去啦相关原理可以看<学VC编游戏>中的示例代码而在Delphi里更容易,只要注意CopyRect两次,第二次的最后一个参数变一下就行了 procedure TSubtitleEdit.DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor);var bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap; oldcol: Longint;begin try bmpAND := TBitmap.Create; bmpAND.Width := Bmp.Width; bmpAND.Height := Bmp.Height; bmpAND.Monochrome := True; oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent)); BitBlt(bmpAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle, 0,0, SRCCOPY); SetBkColor(Bmp.Canvas.Handle, oldcol); bmpINVAND := TBitmap.Create; bmpINVAND.Width := Bmp.Width; bmpINVAND.Height := Bmp.Height; bmpINVAND.Monochrome := True; BitBlt(bmpINVAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY); bmpXOR := TBitmap.Create; bmpXOR.Width := Bmp.Width; bmpXOR.Height := Bmp.Height; BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle, 0,0, SRCCOPY); BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpINVAND.Canvas.Handle, 0,0, SRCAND); bmpTarget := TBitmap.Create; bmpTarget.Width := Bmp.Width; bmpTarget.Height := Bmp.Height; BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Cnv.Handle, x,y, SRCCOPY); BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpAND.Canvas.Handle, 0,0, SRCAND); BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpXOR.Canvas.Handle, 0,0, SRCINVERT); BitBlt(Cnv.Handle, x,y,Bmp.Width,Bmp.Height, bmpTarget.Canvas.Handle, 0,0, SRCCOPY); finally bmpXOR.Free; bmpAND.Free; bmpINVAND.Free; bmpTarget.Free; end;end;看有用么 用 .png格式的图片就行了。。背影是透明的。 用.png格式的图片。用DELPHI提供的基础控件就行。用IMAGE控件就OK MainMenu的一个奇怪的问题 关于获取CXGRID注脚值 字节组合成字 怎样对多表查询的结果进行递交更新 创建公用模块 在Delphi中怎么制作浮动工具栏 谁有的delphi 5.0 下载Ado的补丁包,解决Bof、Eof问题 的序列号急 请问LISTVIEW要想得到当前选择行的内容,怎么写代码。谢了。 Winamp3 是怎样重载系统菜单的 在form1.onactivate时如何关闭或hide窗口? 【求助】文件传输断电续传的问题 100 不够再加 再次问关于Delphi 6 的TIdTCPClient超时问题。是delphi 6!!!
然后把alpha设置个透明值
然后再把原图跟背景进行与运算就贴上去啦
相关原理可以看<学VC编游戏>中的示例代码
而在Delphi里更容易,只要注意CopyRect两次,第二次的最后一个参数变一下就行了
clTransparent: TColor);
var
bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
oldcol: Longint;
begin
try
bmpAND := TBitmap.Create;
bmpAND.Width := Bmp.Width;
bmpAND.Height := Bmp.Height;
bmpAND.Monochrome := True;
oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
BitBlt(bmpAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,
0,0, SRCCOPY);
SetBkColor(Bmp.Canvas.Handle, oldcol); bmpINVAND := TBitmap.Create;
bmpINVAND.Width := Bmp.Width;
bmpINVAND.Height := Bmp.Height;
bmpINVAND.Monochrome := True;
BitBlt(bmpINVAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY); bmpXOR := TBitmap.Create;
bmpXOR.Width := Bmp.Width;
bmpXOR.Height := Bmp.Height;
BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,
0,0, SRCCOPY);
BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
bmpINVAND.Canvas.Handle, 0,0, SRCAND); bmpTarget := TBitmap.Create;
bmpTarget.Width := Bmp.Width;
bmpTarget.Height := Bmp.Height;
BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Cnv.Handle, x,y,
SRCCOPY);
BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
bmpAND.Canvas.Handle, 0,0, SRCAND);
BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
bmpXOR.Canvas.Handle, 0,0, SRCINVERT);
BitBlt(Cnv.Handle, x,y,Bmp.Width,Bmp.Height, bmpTarget.Canvas.Handle, 0,0,
SRCCOPY);
finally
bmpXOR.Free;
bmpAND.Free;
bmpINVAND.Free;
bmpTarget.Free;
end;
end;
看有用么