图形加相框如何实现,急急急,高手进 ( 积分: 200 )

  • 主题发起人 主题发起人 匪匪
  • 开始时间 开始时间

匪匪

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个背景图,前景图就是一个相框,都是jpg格式的图片。现在我想让相框位于背景图的最上面,图片从相框中间的特殊区域透过来。最后显示的效果是,相框的框框盖住了背景图,其它任何地方都没有盖住背景图。
相框中间是一个纯色,按照朋友的提示,我将相框中间改成了黑色,这样通过图像与或操作,就把背景图显示出来了。可是相框的框框与背景图进行了叠加。有什么办法实现我前面说的效果呢。
另外还要实现相框与背景图分别移动,也就是调整相框的位置。不知道说清楚没。主要有两个问题,一共200分,明天上午来看,希望高手能帮我解决。小弟只有200分了,实在不好意思啊。
 
图片从相框中间的特殊区域透过来??
对于你的这个效果,我没有办法到底是怎么透过来,是Alpha效果还是其他什么的。
 
传说中的卷起千堆雪还在不?还有其它朋友在不?大家帮我想想啊。急啊。[:(]
 
现在相框合成是实现了,但是我都画在了一个TBitmap 上面,现在想分别移动相框、背景或改变其大小。好像不好做啊。不知道在鼠标三个事件里面进行处理,对图片进行清除与重画,效果会怎么样。有没有简单点的方法,让他们显示在一个TImage中。操作对象就方便处理些。
 
真没人遇到过这种问题吗?????[:(]
 
。。。。真没人知道了。。。。
 
不让窗口重化消息刷新窗口(WM_ER***,具体消息忘记了),这样可以降低些闪屏,如果图片不是太大,闪屏现象一该不严重。
还有一种解决办法,就是把图片绘制放在Application.OnIdle里面,自己控制刷新频率(如果不控制,则CPU使用率比较高),闪屏现象可以解决。在鼠标事件中改变图片的位置就可以了。
 
有具体的范例不?因为我的图片可能是画上去的,不是用的image,小弟对图像处理不熟啊。。。。
 
//制作像框
procedure FitImageSize(AGrap: TGraphic;AWidth,AHeight:integer;MakeFrame:boolean);
var
ABmp: Tbitmap;
value:double;
ABGBmp:tbitmap;
begin

ABmp := Tbitmap.Create;
ABmp.assign(AGrap);

ABGBmp:=tbitmap.Create;
ABGBmp.Width:=AWidth;
ABGBmp.height:=Aheight;
ABGBmp.Canvas.Brush.Color:=$ffffff;//eeeeee;
ABGBmp.Canvas.FillRect(ABGBmp.Canvas.ClipRect);

if abs(AWidth-ABmp.Width)<abs(AHeight-ABmp.height) then
value:= AHeight/ABmp.height
else
value:= Awidth/ABmp.Width;
value:=abs(value);
ScalBmp(round(ABmp.Width * value )-3,round(ABmp.height * value )-3,ABmp);
if MakeFrame then
begin
ABGBmp.Canvas.Pen.Color:=$ffffff;
ABGBmp.Canvas.MoveTo(0,0);
ABGBmp.Canvas.LineTo(ABGBmp.Width-2,0);
ABGBmp.Canvas.MoveTo(0,ABGBmp.Height-2);
ABGBmp.Canvas.LineTo(ABGBmp.Width-1,ABGBmp.Height-2);
ABGBmp.Canvas.MoveTo(0,0);
ABGBmp.Canvas.LineTo(0,ABGBmp.Height-2);
ABGBmp.Canvas.MoveTo(ABGBmp.Width-2,0);
ABGBmp.Canvas.LineTo(ABGBmp.Width-2,ABGBmp.Height-2);

ABGBmp.Canvas.Pen.Color:=$999999;
ABGBmp.Canvas.MoveTo(0,ABGBmp.Height-1);
ABGBmp.Canvas.LineTo(ABGBmp.Width-1,ABGBmp.Height-1);
ABGBmp.Canvas.MoveTo(ABGBmp.Width-1,0);
ABGBmp.Canvas.LineTo(ABGBmp.Width-1,ABGBmp.Height);
end;

ABGBmp.Canvas.Draw((ABGBmp.Width - ABmp.Width) div 2,(ABGBmp.height - ABmp.height) div 2,ABmp);
AGrap.assign(ABGBmp);
ABGBmp.Free;
ABmp.Free;
end;

//缩放图片
procedure ScalBmp(AWidth, AHeight: Integer; var ABmp: Tbitmap);
var
b: Tbitmap; //临时位图
begin
try
b := Tbitmap.Create; //建立临时位图
b.PixelFormat := pf24bit;
with b do
begin
Width := AWidth; //临时位图的大小为90x90
Height := AHeight;
end;
b.Canvas.StretchDraw(b.Canvas.Cliprect, ABmp); //缩放适应
ABmp.assign(b);
b.Free;
except
Sleep(0);
end;
end;
 
高手帮顶了
 
这个是图形处理中的问题你可以根据像筐图形的颜色等让2张图形截加时候对像素处理就可以实现 qq:729974631
 
给你写个函数,调用这个函数可以达到你随意调整图像大小的需求。
几条语句就搞定,感谢delphi的开发者们吧:)。
{参数 ICanvas 你要画到的对象的画布对象 比如form或者panle等等拥有Canvas属性的控件
IxkFileName 像框位图的 绝对路径名
IxkFileName 要叠加图片的 绝对路径名
IXkTransColor 像框透明部分的颜色
}
procedure AddPic(ICanvas:TCanvas;IxkFileName,IPicFileName:String;IXkTransColor:TColor);
Var
LXk,lpic:TBitmap;
Begin
LXk:=TBitmap.Create;
lpic:=TBitmap.Create;
Try
LXk.TransparentColor:=IXkTransColor;
LXk.Transparent:=True;
ICanvas.StretchDraw(ICanvas.ClipRect,lpic);
ICanvas.StretchDraw(ICanvas.ClipRect,LXk);
Finally
LXk.Free;
lpic.Free;
End;
End;
 
呵呵,我这里也有一个,以前自己写的,用于在生成的卡片上盖章。
{
dest 是目标bitmap
source 是要附加到上边去的东西
destrect,是附加到什么区域去
srcRect 是截取原图片的某个区域
tcl 是透明色
}
procedure DrawTrans(var dest:TBitmap;destRect :TRECT;source:TBitmap;srcRECT :TRECT;tCl:TColor);
var
tb1,tb2:TBitmap;
R,G,B:Byte;
i,x,y :Integer;
cs,cd:PByteArray;
begin
{初始化}
R:=GetRValue(tcl);
G:=GetGValue(tcl);
B:=getBvalue(tcl);
tb1:=Tbitmap.Create ;
tb2:=Tbitmap.Create ;
tb1.HandleType :=bmDIB;
tb2.HandleType :=bmDIB;
tb1.PixelFormat :=pf24bit;
tb2.PixelFormat :=pf24bit;
{第一步: 变大小,将source中srcRect部分拷贝出来并缩放为 destREct大小
这里为了减小失真采取两步,后截取,后变大小,);
这里有个坐标转换的问题 }
tb1.Width :=srcrect.Right -srcrect.Left;
tb1.Height :=srcrect.Bottom -srcrect.Top;
tb1.canvas.CopyRect(rect(0,0,srcrect.Right -srcrect.Left ,srcrect.Bottom -srcrect.Top),source.Canvas ,srcRect);
tb2.Height :=dest.Height ;
tb2.Width :=dest.Width ;
tb2.Canvas.StretchDraw(destrect,tb1);
tb1.FreeImage ;
tb1.Assign(dest);
{第二步: 复制费透明部分}
tb2.Width :=tb1.Width ;
tb2.Height :=tb1.Height ;
for Y:=0 to tb2.height -1 do
begin
cd:=tb1.ScanLine[Y];
cs:=tb2.ScanLine[Y];
for X:=0 to tb2.Width -1 do
if not((cs[X*3]=B)and(cs[X*3+1]=G)and(cs[X*3+2]=R)) then
for I:=0 to 2 do cd[x*3+I]:=cs[x*3+I];
end;
dest.Assign(tb1);
tb1.free;
tb2.free;
end;
 
晕,几天没来,这么多好心人在帮我看啊,真对不起大家。我好好看看啊。呵呵。[:D]
 
咋天试了下,还在试中,大家稍等啊。
 
又过了几天,真不好意思。因为前几天我自己已实现了相框穿透的效果,但是我用了两张图做mask,利用了bitblt函数,虽然做出来了,但没有mmzmagic兄做的好,所以我一开始就被mmzmagic的方法吸引了。最后利用他的原理,我在只有一个图的情况下实现了。但是有个问题存在。我是在panel中画的。 PCanvas.Handle := GetDC(Panel2.Handle);自己取得了Panel2的canvas,发现在重绘的过程中,闪烁严重,我已开了双缓冲也如此。希望大家再能帮下小弟。因为我没多少分了,等闪烁问题解决后,就把分送上。
还有一个就是我想在相框或图片上显示一条蚂蚁线出来。这个我已找到代码,但是八个小矩形框没有。我也画了。我想实现像photoshop中的选择框效果出来:在一张图片上显示出蚂蚁线,且有八个小矩形,当鼠标移到这八个矩形上时,能自由的改变图片大小。这个问题先抛出来。[:)]大家再帮下我啦
 
多人接受答案了。
 
后退
顶部