怎么实现PNG图片的叠加(100分)

  • 主题发起人 主题发起人 wang_cai1
  • 开始时间 开始时间
W

wang_cai1

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有两张图片1.png,2.png,现在要求
读取1.png,然后把2.png叠加到1.png上显示出来,原图片不变,只是显示时叠加在一起。
请问各位如何实现?谢谢!
 
用这个试试TPNGImage 1.43 (PNG格式图像组件)
http://www.delphifans.com/SoftView/SoftView_507.html
 
TPNGImage无法实现整个桌面透明
 
procedure TForm1.FormCreate(Sender: TObject);
var
pt1, pt2 : TPoint;
sz : TSize;
bf : TBlendFunction;
Png: TPngObject;
Rect: TRect;
begin
//-------为窗口添加必要的属性 WS_EX_LAYERED
if SetWindowLong(form1.Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError));
//----调入15张图片,tgpbitmap是gdi+ 的类,支持带alpha 通道的png 文件
bitmap:=tgpbitmap.Create('c:/1.png');
form1.Width:=bitmap.GetWidth+100;
form1.Height:=bitmap.GetHeight+100;
pt1 := Point(left, top); //窗口做上角的坐标
pt2 := Point(0, 0); //这个就不用说了,一看见(0,0)就应该明白了
sz.cx := bitmap.GetWidth; //尺寸不要超过图像大小,不然窗口就什么都没有了,连个影子都没有
sz.cy := bitmap.GetHeight; //同上
bf.BlendOp := AC_SRC_OVER; //这些死记就行了
bf.BlendFlags := 0; //同上
bf.SourceConstantAlpha := $ff; //同上
bf.AlphaFormat := AC_SRC_ALPHA; //同上
//-----------------------------------
DeleteObject(bmp); //前面就是在这里犯的错误,不然占用的内存会无限增大
bitmap.GetHBITMAP(0,bmp); // HBITMAP是windows标准位图格式,支持透明,这里是从tgpbitmap 转化成 HBITMAP
DeleteDC(DC);
Png := TPngObject.Create;
Png.LoadFromFile('c:/2.png');
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := Rect.Left + Png.Width;
Rect.Bottom := Rect.Top + Png.Height;
Png.Draw(Canvas, Rect);
Png.Free;
DC := CreateCompatibleDC(Canvas.Handle); //API的含义我倒是明白,为什么写这句话我就不明白了,反正就是需要
old_bmp := SelectObject(DC, bmp); //同上
UpdateLayeredWindow(form1.Handle, Canvas.Handle, @pt1, @sz, DC, @pt2,0, @bf,ULW_ALPHA); //最关键的地方,前面都在为这句作准备
end;
 
我想在透明的1.png图片上叠加2.png
 
后退
顶部