如何将Canvas里的内容快速的画到一个Bmp中(解决问题后单独开贴赠分)
假设有如下代码(随意些的,没有调试):
var
Dc: HDC;
Bmp: TBitmap;
begin
Bmp:= TBitmap.create;
Bmp.width:= Screen.Width;
Bmp.Height:= Screen.height;
DC:= GetDC(0);
//如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成
Bmp.free;
ReleaseDC(nil, 0);
end;
问题点数:20、回复次数:16Top
1 楼zwjchina(蒲石)回复于 2005-08-02 19:32:16 得分 0
var
Dc: HDC;
Bmp: TBitmap;
begin
Bmp:= TBitmap.create;
Bmp.width:= Screen.Width;
Bmp.Height:= Screen.height;
DC:= GetDC(0);
Bmp.Canvas.Handle := DC;
//如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成
Bmp.free;
ReleaseDC(0, DC);
end;
Top
2 楼zwjchina(蒲石)回复于 2005-08-02 19:33:38 得分 0
测试了下。。可行。。。
procedure TForm1.Button1Click(Sender: TObject);
var
Dc: HDC;
Bmp: TBitmap;
begin
Bmp:= TBitmap.create;
Bmp.width:= Screen.Width;
Bmp.Height:= Screen.height;
DC:= GetDC(0);
Bmp.Canvas.Handle := DC;
//如何将DC中的内容快速的画到Bmp中,最好能在10毫秒内完成
Canvas.CopyRect(Rect(0, 0, 200, 200), Bmp.Canvas, Rect(0, 0, 200, 200));
Bmp.free;
ReleaseDC(0, DC);
end;Top
3 楼operfume(橘子香水)回复于 2005-08-02 20:57:08 得分 0
zwjchina(蒲石)的方法可以.Top
4 楼fengjn(颗粒)回复于 2005-08-04 09:45:23 得分 0
使用CreateCompatibleBitmap会不会提高速度?
CreateCompatibleBitmap怎么使用?Top
5 楼fengjn(颗粒)回复于 2005-08-04 09:59:36 得分 0
zwjchina(蒲石)的方法是错误的。
Bmp.Canvas.Handle := DC;只是关联以下画布。无法存成BmpTop
6 楼xixuemao(钱不是问题,问题是没钱)回复于 2005-08-04 10:20:27 得分 0
procedure TForm1.Button1Click(Sender: TObject);
var
dc: hdc;
bmp: TBitmap;
begin
bmp:= tbitmap.Create;
bmp.Width := screen.Width;
bmp.Height := screen.Height;
dc:= getdc(0);
bitblt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);
bmp.SaveToFile('d:\aa.bmp');
releasedc(handle,dc);
bmp.Free;
end;Top
7 楼fengjn(颗粒)回复于 2005-08-04 10:54:11 得分 0
bitblt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);
和
bitblt(form1.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,srccopy);
的执行速度相差太多。前者在150毫秒左右,而后者在15毫秒左右甚至更快。
Top
8 楼ehom(?!)回复于 2005-08-04 11:53:54 得分 20
正常,前者是DDB->DDB,后者是DDB->DIB,不是一回事。你的ReleaseDC有错,当然后面大家给你修正了。
Bmp.Canvas.Handle := DC;肯定是不对的,这种代码本身就是错误的。
我不知道你如何计算的执行时间?我用了多种方法计算执行时间,在我的计算机上该条语句我循环执行1000次花的时间也只有500毫秒,执行一次时间忽略不计。而且我屏幕的分辨率是1280*1024。
常规方法里,直接调用API肯定是最快的方法了。Top
9 楼fengjn(颗粒)回复于 2005-08-04 13:34:10 得分 0
procedure TForm1.Button1Click(Sender: TObject);
var
StartTick: integer;
HOld: HGDIOBJ;
begin
startTick:= GetTickCount;
BitBlt(MemDC, 0, 0, 1024, 768, Dc, 0, 0 ,SrcCopy);
ShowMessage(IntToStr(GetTickCount - StartTick));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DC:= GetDC(0);
HBmp:= CreateCompatibleBitmap(DC, 1024, 768);
MemDc:= CreateCompatibleDC(DC);
SelectObject(MemDC, HBmp);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(MemDc);
DeleteObject(HBmp);
releaseDC(0, DC);
end;
在我这里显示的125 屏幕1024*768 * 32。
使用Mirror Draw也是差不多的结果Top
10 楼fengjn(颗粒)回复于 2005-08-04 13:38:54 得分 0
能把您的代码贴出来么?Top
11 楼ehom(?!)回复于 2005-08-04 13:49:49 得分 0
恩,看来是机子性能差距太大了,我这里如果把分辨率改成1024*768测试,也要循环个600-800遍才能得到125这个结果。Top
12 楼fengjn(颗粒)回复于 2005-08-04 14:07:18 得分 0
啊?不会有这么大的差距吧。
我的机器是P43.0、128显卡、1G内存。
能把您的代码贴出来么?
您的代码是DDB->DIB么?Top
13 楼ehom(?!)回复于 2005-08-04 14:11:31 得分 0
我就是用你的代码Top
14 楼fengjn(颗粒)回复于 2005-08-04 14:15:05 得分 0
晕死!!!!
我在另一个机器上测试也快的很。
请问大虾熟悉Mirror Draw么?Top
15 楼ehom(?!)回复于 2005-08-04 14:22:02 得分 0
没听说过Top
16 楼ehom(?!)回复于 2005-08-04 14:25:00 得分 0
我的机器是AMD Athlon 64 3200+ (Venice)、ASUS A8N-SLI Deluxe、Kingston 512M DDR400*2、Geforce 6800GT DDR3 256MTop




