CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  GAME,图形处理/多媒体

如何将Canvas里的内容快速的画到一个Bmp中(解决问题后单独开贴赠分)

楼主fengjn(颗粒)2005-08-02 18:40:04 在 Delphi / GAME,图形处理/多媒体 提问

假设有如下代码(随意些的,没有调试):  
  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

相关问题

  • canvas
  • bmp
  • 请问如何将paintbox中的canvas上的图像保存为*.bmp格式的文件
  • 在WORD插件中如何保存一个图片到一个单独的BMP/JPG文件中?
  • jpg->bmp
  • 请教如何将数据信息写入BMP文件中?? 高分相赠!!
  • Canvas的问题?
  • 再问Canvas->Rectangle(。。。)
  • Canvas 問題
  • Canvas does not allow drawing!

关键词

  • dc
  • 代码
  • 执行
  • 内容
  • bmp
  • tbitmap
  • canvas
  • releasedc
  • getdc
  • starttick

得分解答快速导航

  • 帖主:fengjn
  • ehom

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo