如题:用delphi写,统一函数名
procedure CopyScreen(bmp: TBitmap);
将屏幕的内容保存到bmp参数中。速度最快的100分

解决方案 »

  1.   

    我用这个,不过速度不快
    procedure CopyScreen(FileName: String = ''; IsJpg: Boolean = True;
      JpgQuality: Integer = 70);
    //
    //uses Graphics, ExtCtrls, Jpeg;
    var
      SourceDC, DestDC, BHandle: THandle;
      Bitmap: TBitmap ;
      MyJpeg: TJpegImage;
    begin
      //设置文件名
      if FileName = '' then
        FileName := GetGuid;  SourceDC:=CreateDC('DISPLAY','','',nil);{创建源设备环境,DISPLAY为显示器}
      DestDC:=CreateCompatibleDC(SourceDC);
      BHandle:=CreateCompatibleBitmap(SourceDC,Screen.Width,Screen.Height) ;//创建和SourceDC兼容的目标设备环境
      SelectObject(DestDC,BHandle); //创建一个和SourceDC兼容的内存设备环境,并返回其设备句柄
      BitBlt(DestDC,0,0,Screen.Width,Screen.Height,SourceDC,0,0,SRCCOPY) ; //抓图
      Bitmap:=TBitmap.Create; //Bitmap为TBitmap类型
      Bitmap.Handle:=BHandle;
      Bitmap.SaveToFile(FileName + '.bmp');
      if IsJpg then begin//保存为jpg文件
        Bmp2Jpg(Bitmap, MyJpeg, JpgQuality);
        MyJpeg.SaveToFile(FileName + '.jpg');
        MyJpeg.Free;
        DeleteFile(FileName + '.bmp');
      end;
      Bitmap.Free;
      DeleteDC(DestDC);
      ReleaseDC(BHandle,SourceDC); //释放设备环境
    end;function Bmp2Jpg(Bmp: TBitmap; var Jpg: TJpegImage;
      Quality: Integer = 70): TJpegImage;
    //Bitmap 和 JPEG 格式间的快速转换
    //uses Jpeg;
    begin
      if not Assigned(Jpg) then
        Jpg := TJpegImage.Create;
      if Assigned(Bmp) then begin
        Jpg := TJpegImage.Create;
        Jpg.Assign(Bmp); {It′s all folks...}
        Jpg.CompressionQuality := Quality;
        Jpg.JPEGNeeded; {Key method...}
        Jpg.Compress;
      end;
      Result := Jpg;
    end;
      

  2.   

    不就是bitblt吗?
    能有多大差别呀。
    首先要保证bmp的大小与screen一样。
    procedure CopyScreen(bmp: TBitmap);
    begin
      Bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0, 0, SRCCOPY);
    end;
      

  3.   

    可能还是没有说明白,我要实现一个网络会议。会议的主持者可以将自己的桌面共享,让其他人查看。
    技术上来讲,就是需要快速的得到屏幕内容然后在发送。抓屏可以使用Bitblt + GetDC,还可以直接从显卡中获得数据,其实方法好象挺多的。to:549
    确实,好久没有上了。现在在主要就是搞这个项目。我基本还是每天都在qq上,随时可以联系我:)
      

  4.   

    >>还可以直接从显卡中获得数据win32下应该写驱动吧,我不清楚在dos下就是用一个长指针指向显卡的缓冲区地址,顺序读就可以
      

  5.   

    我觉得抓屏速度倒不是关键,关键是传输哦
    pcanywhere的速度快啊
      

  6.   

    我期望的速度是抓屏需要控制在50毫秒左右,这样可以实现大概每秒10帧左右的效果。至于图片的传输我认为不是关键,程序应用在局域网中,带宽比较宽,而且我是将屏幕划分成许多小块,对于没有变化的块不进行传输。
    抓屏的方式我知道GDI和Driect等方式,Driect实际就是从现卡取数据。但是把数据从现卡拷贝到内存的速度也不快,从内存到现卡的速度倒是非常快。不知道是什么原因。
      

  7.   

    10/100M的速度足够快了,传输速度绝对不是问题>>抓屏的方式我知道GDI和Driect等方式,Driect实际就是从现卡取数据。但是把数据从现卡拷贝到内存的速度也不快,从内存到现卡的速度倒是非常快。不知道是什么原因。用测试工具测试一下,看什么地方耗时最多
      

  8.   

    传输速度绝对不是问题不一定哦,要是抓屏获取的数据不进行压缩的话, 1024*768,24bit的屏幕, 每次抓屏所产生的数据是1024*768*3=2359296B(Byte)=2.25MB(Byte), 100M的以太网的最大(理论)传输速率是100Mbps(bit per second), 2.25MB的数据包最多只能传输大概100/(2.25*8)=5个,这里还没考虑以太网的实际传输速率根本达不到最大值的情况。我觉得要实现楼主的设想,找一个好的压缩算法是关键。与压缩所花费的时间相比,抓屏与网络传输所花费的时间要少得多。
      

  9.   

    to: jadeluo(秀峰) 
    可以实际测试一下1024*768,24bit压缩的时间为15毫秒,压缩后的大小一般小于200k。在抓屏、压缩、传输这三个步骤中,还是抓屏的速度最慢。大概150毫秒。压缩使用Lzrw算法。to:jtg98g3(跳舞的青蛙)
    能不能把你的想法在说细致一点,或者提供一些相关资料。我对显卡的操作也不是很熟悉。
    还有。一定要考虑在会议启动后有人进入系统,他必须能看到所有的内容。如果只发变化的部分,那么它看到的画面可能不完整
      

  10.   

    http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx
      

  11.   

    如果要分区域抓的画,要求水平很高啊,都可以写多媒体教学软件了 
    bitblt 拷贝的话就getdc(0)就行了,但是要分区域的话还得根据消息来检查过滤
      

  12.   

    有個老外寫的源代碼叫 Screenspy ,速度蠻快的,可以研究下.這裡下載:http://www.tomore.com/1/5138.html
      

  13.   

    楼主的思路是对的,
    分区拷贝,只传变化的,然后组合。
    偶以前搞过,效果不理想,水平菜啊,:(
    用了第三方的,RAdmin,真是强!
      

  14.   

    小帆的代码在PLAYICQ中,,低色彩可以,高色彩后立即速度变慢。