Image的图布(canvas)的刷新问题,大侠救命! ( 积分: 100 )

  • 主题发起人 主题发起人 gaqizh
  • 开始时间 开始时间
G

gaqizh

Unregistered / Unconfirmed
GUEST, unregistred user!
Image中装载了一张图片,又在Image的canvas上画了4条红色的线,构成一个透明相框,不遮住Image中的图片。鼠标在Image上拖动时,擦除原有的红色框,随鼠标移动画一个新的框。问题是:怎么把原有的框擦除?而不重载图片?因为图片如果很大,重载就慢得难以忍受。
 
如果红线下面有图片,只好在后台的另一个image保存副本,否则就不用管它
 
要建两个TBitmap,一个用于保存原来的图片,一个用于作图用,
当 mouedown 时 BMP2.Assign(BMP1) 然后开始画新的框
画完以后,iamge.picture.bitmap.assign(bmp2)
 
用一个TShape组件放在Image上面就可以了.
 
帮顶一个
 
最简单办法,dreamisx的办法,或者两个TImage,一个透明

不过没明白楼主的意思,你是选择图片,还是仅仅是一个固定大小的框,移动这个框,如果是动态选择,即框的大小会变化,而你说的重画其实也可以只是部分区域重画

另外你也可以在内存中画,然后整个贴出来
 
重载图片很慢吗? 你先把图片读到一个bitmap里,然后不断的用这个image.Picture.Assign这个bitmap就行了,一点也不慢,把image的parent.DoubleBuffered:=true,也不会闪

如果你觉得麻烦,建议你采用dreamisx的方法,方个shape,简单,还好控制,代码只需要写下面几句就行了

procedure TForm1.FormCreate(Sender: TObject);
begin
Shape1.Brush.Style:=bsClear;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Shape1.Left:=x-Shape1.Width shr 1;
Shape1.Top:=y-Shape1.Height shr 1;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
p:tpoint;
begin
with tshape(sender) do
begin
p:=clienttoparent(point(x,y));
SetBounds(p.x-Width shr 1,p.y-Height shr 1,width,height);
end;
end;
 
不需要重新还原,不然的话会写大量的工作。
对图片清空,重新打开图片,再画一次线就可以解决了。
 
后退
顶部