如题:用delphi写,统一函数名
procedure CopyScreen(bmp: TBitmap);
将屏幕的内容保存到bmp参数中。速度最快的100分
procedure CopyScreen(bmp: TBitmap);
将屏幕的内容保存到bmp参数中。速度最快的100分
解决方案 »
- 很久没来,希望认识的高手还在。Invalid pointer operation
- 关于DBGrid和组件显示问题,急。
- 这段代码在win2000没下任何问题,可以在XP中出错?怎么解决?
- 如何获得avi文件的帧数?
- 将delphi程序改写成powerbuilder程序,试试看!
- 控件定位的问题
- 用delphi怎樣來實現程序的自動啟動功能﹖
- clientDataSet与dxdbgrid配合使用的问题
- 偶用progressbar控件,在butoon的click下写:progressbar.stepit;为什么运行后,不见进度条动呢?
- 关于DC的问题
- 哪里有文章关于Delphi的[ValueListEditor]的使用方法的详细说明?
- 如何实现在不同规格的显示器(尺寸大小和分辨率不同)下运行程序时使窗体和其中的控件随之而变呢?
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;
能有多大差别呀。
首先要保证bmp的大小与screen一样。
procedure CopyScreen(bmp: TBitmap);
begin
Bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0, 0, SRCCOPY);
end;
技术上来讲,就是需要快速的得到屏幕内容然后在发送。抓屏可以使用Bitblt + GetDC,还可以直接从显卡中获得数据,其实方法好象挺多的。to:549
确实,好久没有上了。现在在主要就是搞这个项目。我基本还是每天都在qq上,随时可以联系我:)
pcanywhere的速度快啊
抓屏的方式我知道GDI和Driect等方式,Driect实际就是从现卡取数据。但是把数据从现卡拷贝到内存的速度也不快,从内存到现卡的速度倒是非常快。不知道是什么原因。
可以实际测试一下1024*768,24bit压缩的时间为15毫秒,压缩后的大小一般小于200k。在抓屏、压缩、传输这三个步骤中,还是抓屏的速度最慢。大概150毫秒。压缩使用Lzrw算法。to:jtg98g3(跳舞的青蛙)
能不能把你的想法在说细致一点,或者提供一些相关资料。我对显卡的操作也不是很熟悉。
还有。一定要考虑在会议启动后有人进入系统,他必须能看到所有的内容。如果只发变化的部分,那么它看到的画面可能不完整
bitblt 拷贝的话就getdc(0)就行了,但是要分区域的话还得根据消息来检查过滤
分区拷贝,只传变化的,然后组合。
偶以前搞过,效果不理想,水平菜啊,:(
用了第三方的,RAdmin,真是强!