为何在这样在内存中画图这么慢呢???(50分)

  • 主题发起人 主题发起人 anndy1999
  • 开始时间 开始时间
A

anndy1999

Unregistered / Unconfirmed
GUEST, unregistred user!
这样比直接在PaintBox上画图居然要慢许多, 是什么原因呢????
var
BackMap : TBitMap;
begin
BackMap := TBitMap.Create;
BackMap.Width := PaintBox.Width;
BackMap.Height := PaintBox.Height;
BackMap.Canvas.CopyRect(Rect(0,0,PaintBox.Width,PaintBox.Height),PaintBox.Canvas
Rect(0,0,PaintBox.Width,PaintBox.Height));

BackMap.Canvas.Pen.Color := clLime;
BackMap.Canvas.Pen.Mode :=pmCopy;

BackMap.Canvas.MoveTo(x,y);
BackMap.Canvas.LineTo(x,y);
......

PaintBox.Canvas.CopyRect(Rect(0,0,PaintBox.Width,PaintBox.Height),BackMap.Canvas
Rect(0,0,BackMap.Width,BackMap.Height));
BackMap.Free;
 
没有人给点回复吗?
 
用bitdib快些吧?
 
你这样处理比直接在PaintBox上画图当然要慢了,因为你用Canvas.CopyRect()时,是将一个图片画到Canvas上,它比直接在PaintBox上一条线要慢很多的。
我的建议是:只做一些简单的画图操作时,如:
Canvas.LineTo();
Canvas.Rectangle();
Canvas.Ellipse();
Canvas.Arc();
Canvas.FillRect();
直接在PaintBox上画就可以了,它本身画图就是很快的,没必要通过TBitMap来处理,
只有画图操作有很复杂时,以及需要对图片进行多次处理时,如需要多次调用:
Canvas.Draw();
Canvas.CopyRect();
Canvas.StretchDraw();
等方法后才得到最后的结果,才需要通过在内存中画图方法。
 
只有画图操作有很复杂时,以及需要对图片进行多次处理时,在内存上画
 
我也听说过用bitdib来画,但以前没用过,不知道倒底怎么用的??
哪位有个例子吗?贴出来看看吧。
 
Bitdib? 是函数BitBlt吧,BitBlt函数速度还可以,比Canvas的Draw快

procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
//将图片aaa.bmp画到Canvas上起始位置100, 100, 宽高为原图片宽高,从图片的0, 0位置开始画,
//SRCCOPY参数你可以参考一下帮助,可以换成其它参数做一些特效处理
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('E:/aaa.bmp');
BitBlt(Canvas.Handle, 100, 100, Bitmap.Width, Bitmap.Height,
Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
Bitmap.Free;
end;

//拉伸函数为StretchBlt,也比Canvas的StretchDraw快
SetStretchBltMode(Canvas.Handle,HalfTone);
StretchBlt(Canvas.Handle, 0, 0, Bitmap.Width div 2, Bitmap.Height div 2, Bitmap.Canvas.Handle,
0, 0, Bitmap.Width, Bitmap.Height, SRCCOPY);
 
慢的原因不是你在内存里画.

而是你每次画之前才 Create BMP .画完后又 Free BMP

你的时间都浪费到 Create ,Free 上了.
 
看来,你好像是要模拟双缓冲的方式画图,那你就要所有的图像全部在后台的位图上完成并一次翻转到前台上(就是你的PaintBox),而你现在每次都要拷贝前台的图像当然慢了。
 
提高图象的能力DELPHI的类库已经给出了最好答案/
双缓冲绘图使用BITBLT或者CANVAS。LOCK
从你的代码看,
你把PAINTBOX在绘图前LOCK最后UNLOCK就效果好些。
 
多人接受答案了。
 
后退
顶部