众位大侠,我为什么用copyrect拷贝不出透明背景的图象?(100分)

  • 主题发起人 主题发起人 tuer
  • 开始时间 开始时间
T

tuer

Unregistered / Unconfirmed
GUEST, unregistred user!
众位大侠,源image属性我是设为透明的(并且装载的本来就背景透明的图片),
显示也对,可是为什么我用copyrect方法拷贝到form时结果区域总是带白色的背景,请问
有没有办法解决呢?[red][/red][:(]
 
天哪!难道我的问题很难吗?为什么一个高手都不来,总得让我知道delphi能不能做出来吧?
 
没办法,CopyRect就是这样,以前的背景色是什么,COPYRECT之后还是什么
解决方法如下:
var
b: tbitmap;
begin
b:=tbitmap.Create;
try
b.Assign(Image1.Picture.Graphic);
b.Transparent:=True;
Form1.Canvas.Draw(0,0,b);
finally
b.Free;
end;
end;

“(并且装载的本来就背景透明的图片)”是什么样的图片?GIF?BMP?
 
图片是我用Photoshop做的背景透明(前景为一行字)的bmp图片
 
BMP是不能做成透明的,就算你在Photoshop里做了透明,但生成BMP后,背景会变成白色,
用我上面的方法可以COPY了,代码我已试过,达到你的要求。
但只对BMP有效。
 
leonsu大侠,感谢对小弟的帮助,大侠的程序似乎可以解决问题,只是小弟delphi刚入门,
水平太差,不大读得懂,如Assign方法、Picture.Graphic方法的含义及用法,能否几句主
要的程序做个注释让小弟领会一下,还有为什么程序执行后显示的图象比原image中的图象
大,小弟不解,盼赐教,100分即刻奉上。
 
var
b: tbitmap;//声明一个TBitmap类,
begin
b:=tbitmap.Create;
//创建它,对于大部份动态创建的类或控件,都要这样用,如最常用的Form1:=TForm1.Create(Application);
try//这是一个包括语句,其作用是不管下面的语句有没有正常运行,都会运行Finally中的语句
//类似的还有Try..Except..end,作用是捕捉异常,当Try中的语句没有正常运行进,程序就会从出错的语句跳到except中,运行Except中的代码
b.Assign(Image1.Picture.Graphic);
//这里的Assign有点类似LoadFromFile,Assign的本意是:分配,指派。
//在Delphi中,我们可以把相似的属性直接通过Assign给另一控件或类,
b.Transparent:=True;
Form1.Canvas.Draw(0,0,b);
finally
b.Free;
end;
end;
Picture有两个很特殊的属性:Bitmap与Graphic。属性Bitmap可以看成是Graphic的一个子类,
它们的方法都差不多,但由于有些方法只支持BMP,如ScanLine、Mask等,则这些方法只在Bitmap属性
中存在,Graphic属性中就没有了。
当Picture中的图象是BMP时,这两个属性就没有区别,但如果是Jpeg的话,就不行了,只能访问Graphic属性,
同时,在从外部文件读取时,也一样,如我们要读取一个Jpg格式的图象,就只能用Graphic.LoadFromFile,而不
能使用Bitmap.LoadFromFile,但如果是一个BMP图象,就无所谓了。
至于你说图象变大的问题,我上面的代码没出现过,就算你把Image的Stretch设为True,也不会变大。
但如果你使用的是CopyRect,就可能会,这是因为CopyRect是把一个Rect中的图象完全填充到另一个Rect,
那些能放大图象的“放大镜”软件,其原理就是这样,用CopyRect这个方法,来使屏幕上的图象放大。
如果你不想让图象变大,可以使用Draw,这个方法,它是以原始尺寸来输出图象。

不知道这样的解释你看明白了没有,如还有问题,尽管提出来,大家互相帮助。
顺便说明一下,我不是什么大侠,只是非常喜欢用DELPHI,仅此而己。
 
程序执行后显示的图象比原image中的图象大的问题是我搞错了,不必回答。但我发现以上
的解答还是不能从根本上解决问题!
我的构思原意是想做一行透明背景的特效文字(如金属字)图片,程序执行时从form的左边
慢慢拉伸出来,我不想用改变image的width来做,那样闪烁的厉害,我试了用draw,一次性
画出图象还可以,但用上timer后连续画好象也很闪烁,并且draw不能分部分地画出图形。
好象只有copyrect方法才可以平稳地移动显示出图象,但背景始终不能做到透明,怎么办呢?
源程序:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if i<image1.Width then
begin
rect1:=rect((image1.Width-i),0,image1.Width,image1.Height);
rect2:=rect(0,0,i,image1.Height);
form1.Canvas.CopyRect(rect2,image1.Canvas,rect1);
i:=i+2;
end
else
timer1.Interval:=0;
end;
 
form的oncreate事件中写一句: DoubleBuffered := True;
然后用Timer移动您的image就可以达到你的要求了。
 
搞定了,
在Form的OnCreate事件中写一句:Form1.Canvas.CopyMode:=cmMergeCopy;
其余不变,测试已通过。
 
对了,你的代码也要改一下:
if i<image1.Width then
begin
rect1:=rect((image1.Width-i),0,image1.Width,image1.Height);
rect2:=rect(0,0,i,image1.Height);
form1.Canvas.CopyRect(rect2,image1.Canvas,rect1);
i:=i+2;
end
else
timer1.Interval:=0;//这里不要这样写,会费资源,因为Timer没有关掉!!!
//改为:Timer1.Enabled:=False;,下次要再执行动画时,用Timer1.Enabled:=True;就可以了。
 
试试:TWinControl.PaintTo(...);
 
感谢各位大侠对小弟的帮助,令小弟想起一句话:“听君一席话,胜读十年书!”,望众位
大侠在以后的日子里一如既往地支持小弟,小弟这厢有礼了!
 
后退
顶部