屏幕捕捉(50分)

  • 主题发起人 主题发起人 sunwork
  • 开始时间 开始时间
pengyt,
我觉得BMP压缩成JPEG占用的系统资源太大了,
不知道降低压缩比例是否会减少压缩的时候所占用的系统资源呢?
另外,你所说的算法有没有原程序呢?或者具体怎样做呢?

 
用JPEG压缩,减少压缩比例对减少CPU资源没有太大的作用.
我说的算法是标准的RLE算法,就是根据某个BYTE出现的长度
用这个BYTE和长度值来表示: 比如图像中出现了连续的50个
255, 于是就用 255, 50 这两个 BYTE 来代替这连续的 50
个 BYTE, 这样就节省了大量的空间,对于这个特例来说,压缩
比为 1:25
 
这样抓取当前鼠标形状:

先定义一个cursor变量:
var GlobalCur:TIcon;
windowhld:hwnd;
threadld:dword;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil);
AttachThreadInput(GetCurrentThreadId,threadld,true);
GlobalCur:=TIcon.Create;
GlobalCur.handle:=GetCursor;
AttachThreadInput(GetCurrentThreadId,threadld,false);
然后
bitmap.canvas.brush.Style:=bsclear;
bitmap.canvas.draw(x,y,GlobalCur); //x,y的值可以通过GetCursorPos得到

至于图像压缩嘛,估计pcANYWHERE等都有自己的压缩算法,不过我看基本上都是把
图形压缩成了16色,因为看上去质量很差,不过用于普通桌面监控足够了.而且感觉
pcANYWHERE是全屏刷新的.
另:
 
pcanywhere
他第一降低图像的颜色数,
第二,她只更新有变化的矩形部分,这就减少了大部分数据量。
 
把图像缩小后传是否能够达到要求?
 
如何做可以只是更新屏幕的有变化的部分呢?
我觉得在屏幕图象的压缩传送上还要探讨一下。
 
附加功能 将问题提前
 
to cAkk,
你好!!你的截取鼠标图形好象有时候不能及时反映鼠标形状的变化,
有点奇怪,有时候行,有时候就是明明这边是箭头,那边却是漏斗。
我原来的程序是没有下面这一句的,
windowhld:=GetForegroundWindow;
所以我只能截取鼠标在标准选择下的形状,其他状态的情况下就没有办法截取到。
我加上以后就可以了,但是好象有时候离开当前的窗体范围的时候,就不能正确
反映,有其他的解决方法吗?谢谢
 
我也做过类似的程序,我的作法是:
利用鼠标指向截取控件或窗体的handle,然后只传递鼠标指向的图象,鼠标可在客户端自己重画.
 
要不,就截获鼠标的位置,然后自己画一个鼠标...
我记得HyperSnap的软件中有一个选项是可以同时拷贝鼠标的,
不知道是怎么实现的...
 
to liangliang:
用你的办法,在后台重画的窗口就不能被更新了。
 
sunwork:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
关注..........
 
SunWork:你试过每次传一部分图像没有?比如第1帧是传1,4,7,10。。。线
第2帧传2,5,8。。。线,第三次传3,6,9。。。线,或者第一次传左上的1/8块,
第二次下一个1/8块,数据量会小一点
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
591
import
I
I
回复
0
查看
571
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部