导航:
论坛 -> 网络通讯
斑竹:liumazi,sephil
作者:
2007/2/11 17:30:38
标题:
征集最快的网络屏幕传输原理和代码(不用Mirror驱动)!超过Radmin和最新版的黑洞2007(v1.x)
浏览:24967
加入我的收藏
楼主:
我分析了Radmin的抓屏和显屏API代码,抓屏它采用的是逐行扫描,显屏它采用的是全屏显示。就是不知道他使用的什么压缩,他发送时好像没有用内存XOR运算发送不同的数据,但不知道他使用什么压缩方法发送的。 r_server SRCCOPY = $00CC0020; { dest = source function CreateDCA(lpszDriver, lpszDevice, lpszOutput: PAnsiChar; lpdvmInit: PDeviceModeA): HDC; stdcall; lpszDriver 'DISPLAY' lpszDevice nil lpszOutput nil lpdvmInit nil function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall; DC CreateDCA 的返回值 Index RASTERCAPS = 38; { Bitblt capabilities function CreateCompatibleDC(DC: HDC): HDC; stdcall; DC CreateDCA 的返回值 function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall; DC CreateDCA 的返回值 Index HORZRES = 8; { Horizontal width in pixels function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall; DC CreateDCA 的返回值 Index VERTRES = 10; { Vertical height in pixels function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall; DC CreateDCA 的返回值 Width GetDeviceCaps HORZRES的返回值 Height 0x00000001 function GetObjectA(p1: HGDIOBJ; p2: Integer; p3: Pointer): Integer; stdcall; p1 CreateCompatibleBitmap 的返回值 p2 ?24 p3 ? function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall; DC CreateCompatibleDC 的返回值 Index RASTERCAPS = 38; { Bitblt capabilities function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall; DC CreateCompatibleDC 的返回值 Index BITSPIXEL = 12; { Number of bits per pixel function CreateBitmap(Width, Height: Integer; Planes, BitCount: Longint; Bits: Pointer): HBITMAP; stdcall; Width 5 Height 1 Planes 1 BitCount 10 Bits 0 function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC CreateCompatibleDC 的返回值 p2 CreateBitmap 的返回值 function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall; DC CreateCompatibleDC 的返回值 X 0x00000000 Y 0x00000000 Color 0x000000FF function GetBitmapBits(Bitmap: HBITMAP; Count: Longint; Bits: Pointer): Longint; stdcall; Bitmap CreateBitmap 的返回值 Count 0x00000002 Bits function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall; DC CreateCompatibleDC 的返回值 X 0x00000000 Y 0x00000000 Color 0x0000FF00 function GetBitmapBits(Bitmap: HBITMAP; Count: Longint; Bits: Pointer): Longint; stdcall; Bitmap CreateBitmap 的返回值 Count 0x00000002 Bits function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall; DC CreateCompatibleDC 的返回值 X 0x00000000 Y 0x00000000 Color 0x00FF0000 function GetBitmapBits(Bitmap: HBITMAP; Count: Longint; Bits: Pointer): Longint; stdcall; Bitmap CreateBitmap 的返回值 Count 0x00000002 Bits function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC CreateCompatibleDC 的返回值 p2 SelectObject 的返回值 function DeleteObject(p1: HGDIOBJ): BOOL; stdcall; p1 CreateBitmap 的返回值 function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall; DC CreateDCA 的返回值 Width 0x00000400 Height 0x00000015 function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC CreateCompatibleDC 的返回值 p2 CreateCompatibleBitmap 的返回值 function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall; DestDC CreateCompatibleDC 的返回值 X 0x00000000 Y 0x00000000 Width 0x00000400 Height 0x00000001 变 SrcDC CreateDCA 的返回值 XSrc 0x00000000 变 YSrc 0x0000000F 变 Rop SRCCOPY function GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: TBitmapInfo; Usage: UINT): Integer; stdcall; DC CreateCompatibleDC 的返回值 Bitmap CreateCompatibleBitmap 的返回值 StartScan 0x00000000 NumScans 0x00000001 Bits BitInfo Usage 0x00000000 function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC CreateCompatibleDC 的返回值 p2 CreateCompatibleBitmap 的返回值 function DeleteDC(DC: HDC): BOOL; stdcall; DC CreateDCA 的返回值 function DeleteDC(DC: HDC): BOOL; stdcall; DC CreateCompatibleDC 的返回值 function DeleteObject(p1: HGDIOBJ): BOOL; stdcall; p1 SelectObject 的返回值 radmin function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC p2 function ExtCreateRegion(XForm: PXForm; Count: DWORD; const RgnData: TRgnData): HRGN; stdcall; XForm nil 单元转换 Count 数据大小 RgnData 数据 function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; -> -> DC SelectObject 的DC Region ExtCreateRegion 的返回值 返回值 COMPLEXREGION = 3 function SetDIBitsToDevice(DC: HDC; DestX, DestY: Integer; Width, Height: DWORD; SrcX, SrcY: Integer; nStartScan, NumScans: UINT; Bits: Pointer; var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall; DC SelectObject 的DC DestX 0 服务端屏幕X DestY 0 服务端屏幕Y Width $320 服务端屏幕Width Height $258 服务端屏幕Height SrcX 0 SrcY 0 nStartScan 0 NumScans $258 Bits 数据? BitsInfo Usage 不知道DIB_RGB_COLORS function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; -> DC SelectObject 的DC Region 0 返回值 SIMPLEREGION = 2 function DeleteObject(p1: HGDIOBJ): BOOL; stdcall; p1 ExtCreateRegion 的返回值 function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC 原 SelectObject 的DC p2 上一个 SelectObject 的返回值 function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC 原 SelectObject 的DC p2 上一个 SelectObject 的返回值 普通模式 function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall; DestDC X 0 服务端屏幕X Y 0 服务端屏幕Y Width $320 服务端屏幕Width Height $258 服务端屏幕Height SrcDC 上一个 SelectObject 的返回值 = 上一个 SelectObject 的DC= 原 SelectObject 的DC XSrc 0 YSrc 0 Rop SRCCOPY 伸拉模式 function SetStretchBltMode(DC: HDC; StretchMode: Integer): Integer; stdcall; DC StretchMode function StretchBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc, SrcWidth, SrcHeight: Integer; Rop: DWORD): BOOL; stdcall; DestDC X Y Width Height SrcDC XSrc YSrc SrcWidth SrcHeight Rop function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DC 上一个 SelectObject 的返回值 = 上一个 SelectObject 的DC= 原 SelectObject 的DC p2 上一个 SelectObject 的返回值 上面是Radmin和R_server所用抓屏和显屏的API函数 他怎么用SetPixel和GetBitmapBits把RGB三种颜色分离成三个流的,是不是位and运算?如果这样分离,压缩率也不会很高的呀! 大家是否有Radmin的C++源代码呀?能否给小弟看一看呀?
----------------------------------------------
-
作者:
2007/2/12 13:25:09
1楼:
也想知道,黑洞的作者陳經韜太喜歡吹噓自己了,從來沒告訴過大家一點思路。 兄弟的分析還要詳細一點,摸清大致的思路才行。
----------------------------------------------
-
作者:
2007/2/12 15:28:58
2楼:
1024*768*32 BitBlt = 30ms - 50ms ZLib壓縮 = 90ms - 150ms 傳輸 = 20ms 所以要想達到40貞/秒,不可能整屏讀取,不能大數據壓縮。 不知道老兄是怎麼知道RA是逐行掃描而不是分塊掃描,希望多多討論。
----------------------------------------------
-
作者:
2007/2/12 16:37:40
3楼:
我也很想知道啊,希望大家一起讨论出一个最好得方案 听说使用DDK编写比较好,可是完全不懂,汗~~~ 希望高手们多告诉我们一点
----------------------------------------------
-
作者:
2007/2/13 13:34:54
4楼:
用API调试工具调试Radmin的服务端就可知道他是逐行扫描了 SimpleSC, ScreenSpy 是分块扫描的,也非常快
----------------------------------------------
-
作者:
2007/2/13 15:32:08
5楼:
我做過分塊掃描,能達到10貞/秒的速度,數據量也比較小,但主要是占了70%的CPU,不好用。
----------------------------------------------
-
作者:
2007/2/13 15:35:43
6楼:
SimpleSC, ScreenSpy 的代碼我也分析過,也是占CPU,被動掃描我覺得是不可取得。所以想改用HOOK做,減少CPU的占用率。
----------------------------------------------
-
作者:
2007/2/13 15:52:43
7楼:
你用Hook做?APIHook?那9x下能够正常工作?我有9x下系统级WideHook的代码!不用vxd驱动的! 参考VNC的代码?Radmin v2.x 可没用Hook做,cpu占用率也不大呀! 我的QQ:523595680 我的QQ群:16973143 共同探讨世界上最快的屏幕传输和世界上最强的Hook!!!
----------------------------------------------
-
作者:
2007/2/26 13:36:40
8楼:
我一点都不懂啊。你们怎么学的啊
----------------------------------------------
-
作者:
2007/3/6 7:52:22
9楼:
希望更多的成員加入,一起進步。
----------------------------------------------
-
作者:
2007/4/12 11:09:13
10楼:
看鸟 但是 不是很懂额
----------------------------------------------
-
作者:
2007/4/13 11:23:13
11楼:
这些很厉害吗? 我怎么看,都觉得不如 M$ 的远程桌面和终端服务呢?
----------------------------------------------
-
作者:
2007/6/24 22:22:37
15楼:
CPU占用还有点大
----------------------------------------------
ASM+Delphi
作者:
2007/6/25 13:32:55
16楼:
當然有低CPU占用的50偵版本。
----------------------------------------------
-
作者:
2007/7/1 13:01:49
19楼:
可以 给 个 源代码 谢谢了 不 知道 是 不 是 DELPHI写的
----------------------------------------------
-
作者:
2007/7/1 16:32:44
20楼:
是 DELPHI写的 源代码现在还不能公布!
----------------------------------------------
-
作者:
2007/7/1 23:32:17
21楼:
速度的确不错的 判楼主的 代码了 学习啊
----------------------------------------------
-
作者:
2007/7/6 16:01:33
22楼:
准備開發遠控程序,歡迎有意向、合作精神而且在遠控方面有水平的同道加入。
----------------------------------------------
-
作者:
2007/7/9 9:13:24
23楼:
lz,请问你用什么工具分析Radmin的抓屏和显屏API代码?
----------------------------------------------
-
作者:
2007/7/9 14:49:33
24楼:
DebugAPISpy
----------------------------------------------
-
作者:
2007/8/4 7:58:15
30楼:
能屏蔽廣告不錯,這個垃圾又來了。
----------------------------------------------
-
作者:
2007/8/4 16:00:11
31楼:
還應該直接刪除發貼記錄,更新順序全亂了。
----------------------------------------------
-
作者:
2007/8/6 16:36:23
32楼:
出新版本了! GDI_GMSS v0.1f 服务端准备-〉0% cpu占用!
----------------------------------------------
-
作者:
2007/8/8 9:43:52
33楼:
楼上讲讲原理
----------------------------------------------
-
作者:
2007/8/13 6:24:05
34楼:
就是啊,讲讲原理啊
----------------------------------------------
-
作者:
2007/8/15 13:23:33
35楼:
GDI_GMSS v0.1h 版本超强!
----------------------------------------------
-
作者:
2007/9/24 6:41:48
36楼:
怎么没下文了?
----------------------------------------------
-
作者:
2007/9/26 10:09:44
37楼:
第一段落結束了,正在做遠程控件軟件開發,暫時不會再做這方面的研究。
----------------------------------------------
-
作者:
2007/10/14 16:32:06
38楼:
lzo压缩算法不错!使GDI的速度与Mirror驱动的速度差不多了!
----------------------------------------------
-
作者:
2007/10/20 13:40:40
39楼:
出新版本了! GDI_GMSS v0.1h 为了防止非法滥用此程序,此程序采用了反弹作者IP地址的技术!
----------------------------------------------
-
作者:
2007/12/29 18:01:54
40楼:
黑洞是我见过最快的
----------------------------------------------
没有做不到,只有想不到。 bolg:http://hi.baidu.com/lobtao Email:lobtao@qq.com QQ:369687916
作者:
geoh (Fly)
★☆☆☆☆
-
普通会员
2008/3/14 10:02:55
41楼:
UltraVNC 是开源的 貌似是用VC写的!
----------------------------------------------
卖电脑上网!
作者:
2008/3/31 14:24:15
42楼:
我可以说我这个肯定比黑洞快,而且占用CPU比黑洞低,传输数据量比黑洞小!
----------------------------------------------
-
作者:
2008/4/21 11:36:00
43楼:
真的这么牛。
----------------------------------------------
-
作者:
2008/4/26 14:21:06
46楼:
GDI_MRSS_D v0.1q Build 080401 最新版 發佈日期:2008年04月26日
----------------------------------------------
-
作者:
smial (smial)
★☆☆☆☆
-
普通会员
2008/6/20 21:11:39
47楼:
楼上的给我分析下你的源码。。。。
----------------------------------------------
-
作者:
2008/7/2 9:46:32
48楼:
不要把问题的讨论和厉害不厉害,高手不高手,这类话题扯到一起。不会的人想学的就学学了,会的人也说说自己的看法,这在个平台里就是技术交流。
----------------------------------------------
-
作者:
2008/7/3 17:43:17
49楼:
对,这个就是扫描屏幕变化的地方呀,其实还有很多方法呢!
----------------------------------------------
-
作者:
2008/7/8 13:24:17
50楼:
GDI_MRSS_D v0.1r 马上就要发布了。。。。。。。。。。
----------------------------------------------
-
作者:
2008/7/8 15:10:36
51楼:
呵呵,希望学习大作,最好代码能开源,呵呵
----------------------------------------------
-
作者:
2008/9/12 12:10:06
52楼:
原理是最要的,优化其次重要!代码只是实现而已!
----------------------------------------------
-
作者:
2008/9/12 13:15:47
53楼:
請問genius2005, 你的新版可在Delphi2009編譯成功嗎?
----------------------------------------------
-
作者:
xjl (jack)
★☆☆☆☆
-
盒子活跃会员
2008/9/12 16:33:15
54楼:
---------- 假设服务端是被控制的机器,客户端是控制的机器。 1、把服务端的屏幕发送次数设成每发送M=30次数据后发一个全屏包给客户端,其余时间服务端在发送前把屏幕分害成40*30块与上一次发送的数据进行对比,把不同的数据进行发送。 2、在遇到需要全屏进行传送的时候(比如打开新的窗口),记得使M=0。 3、把屏幕图像存成JPG格式,另外变成256色,分辨率降低,屏幕拉升等。 ---------- ---------- 另外,个人感觉Windows应该有一个总控的屏幕刷新程序(比较底层的),换句话说就是驱动程序 Screen.drv ,如果控制这个程序应该比较方便。
----------------------------------------------
-
作者:
2008/9/14 16:49:39
55楼:
开源开源开源,你的 GDI_MRSS_D v0.1q Build 080401 最新版 發佈日期:2008年04月26日 有病毒~~~~~~~~
----------------------------------------------
-
作者:
2008/12/12 14:16:36
56楼:
我的新版完全可在Delphi2009编译成功!
----------------------------------------------
-
作者:
2009/5/16 10:52:43
57楼:
帮顶
----------------------------------------------
-
作者:
2009/5/17 16:42:10
58楼:
关注
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
xndd (xndd)
★☆☆☆☆
-
盒子活跃会员
2009/7/9 11:15:32
60楼:
佩服!我就知道好像Radmin是扫描完与之前数据对比,如果不同才更新数据,节省传输时间
----------------------------------------------
-
作者:
2009/8/17 13:43:36
62楼:
3389傳輸的是GDI指令 而這種傳輸的是位圖 要想快,就要盡量只傳輸變化部分, 好的算法在於快速地找出變化部分, 這也是不同算法的唯一區別。
----------------------------------------------
-
作者:
2009/9/10 13:51:48
63楼:
GDI_MRSS_D v0.1t 新版本,速度更快。内核使用Delphi 2010编译,无壳。 请正向连接,右击列表框添加主机,然后输入IP地址双击连接。
----------------------------------------------
-
作者:
2009/9/17 9:18:35
64楼:
楼上的 为啥我本地测试虚拟机 屏幕最上方一直闪呢
----------------------------------------------
-
作者:
2009/9/21 22:19:40
65楼:
什么地方闪呢?加我QQ:535676060
----------------------------------------------
-
作者:
2009/9/22 10:38:36
66楼:
GDI_MRSS_D v0.1t不错, 建议如下改改,就可以商用了: 1、插入系统进程运行,看不到自身进程。 2、增加反弹连接,自动报告上线! 我自己弄了个屏幕传输,已实现屏幕监控和远程控制,目前卡在插入explorer.exe上了。有的机器开启了DEP保护、NX保护,插入时,会提示“内存不能为write”。想了很多办法,包括用驱动去除保护,都不成功。 genius2005,你准备用什么方式,静默安装你的服务端到其他机器上呢?!
----------------------------------------------
-
作者:
2009/9/24 0:18:45
67楼:
没有合适的方式,尤其在Vista没有办法过……
----------------------------------------------
-
作者:
2009/10/30 15:48:34
68楼:
好贴啊。关注,说说原理嘛。
----------------------------------------------
-
作者:
mj5423 (mj5423)
★☆☆☆☆
-
盒子活跃会员
2009/11/2 1:13:08
69楼:
楼主,能提供个DebugAPISpy的注册码吗?
----------------------------------------------
-
作者:
bmsr (白忙剩人)
★☆☆☆☆
-
普通会员
2010/1/25 17:47:40
70楼:
1.将屏幕分成分成3X3 或4X4 5X5(根据画面变化频率)多线程抓取 每个线程负责一块 3.每线程计算存储自己那块块的校验码. 4.比较原有校验码,相同放弃,不同重复1~4 一致到定义的最小矩形(这个最小矩形传输时间将接近的校验时间),仍不同则传输. 这里关键是校验程序要速度快且又能反映变化的大小
----------------------------------------------
http://blog.sina.com.cn/bmsrnote
作者:
2010/3/7 19:54:54
71楼:
GDI_RDPS_D v0.1a 新版本,速度更快。内核使用Delphi 2010编译,与Radmin v3.4还快,CPU还低!
----------------------------------------------
-
作者:
2010/3/7 21:59:25
72楼:
关注,学习。
----------------------------------------------
-
作者:
2010/3/13 13:46:08
73楼:
市面上的mirror驱动并非能达到最快的屏幕速度,Ring3完全能模拟出那种速度来! Miskya QQ:386868907
----------------------------------------------
-
作者:
2010/7/21 11:10:35
74楼:
http://www.2ccc.com/article.asp?articleid=5724 經典、高效、免費的代碼來了
----------------------------------------------
-
作者:
2012/3/27 21:20:55
76楼:
楼上是?
----------------------------------------------
-
作者:
2015/1/17 14:38:19
77楼:
没研究过,细节说不上。想了下,有个逻辑摆在那: 如果全屏传输能满足要求,那就没什么问题。 如果全屏不能满足,那肯定是差别传输,就要以块(或者是10*10,或者是1*1,或者其它)为单位来检测变化。 如果全部块检测一遍性能差,那只能抽查,发现哪个块发生变化则连同附近的若干块一并传输。 因为界面变化大多数有连续特点,也就此刻这点变化,那下一时刻多半附近会起变化。 既然抽查,就涉及概率,这是数学,门槛高着呢。 如果我的逻辑正确,那网上的源码里如果不涉及概率和神经网络,都不会是最快的解决方案;另外,数学模型这是门槛,这是专利,哪那么容易透露。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
2015/5/28 11:54:32
78楼:
推荐一本书:[计算机图形学的算法基础].Procederal.Elements.for.Computer.Graphics.(美)Rogers.扫描版.pdf 这书完美阐述了,电视机的工作原理,这类屏幕传图,原理就是电视机的那东东。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2015/7/9 19:41:49
79楼:
用Hook效率可以到30帧吗 有没大大有其他更好的方案?
----------------------------------------------
-
作者:
2015/11/30 14:40:06
80楼:
这个问题还这么多人讨论?我老人家10多年前就干过了。不外乎两种: 1. WIENDOWS 终端 3389 的方式。这个需要有资料,能拿到 WINDOWS 的屏幕的数据,它不是传图,所以带宽消耗少,快。 2. 抓屏幕图像。问题是如果全屏,肯定数据里巨大,带宽不够,慢。So...这里办法就多了。参考 VNC 吧: 2.1. 有人说抓全屏,分块,然后比较,只传变化的部分。这个思路挺好。就是消耗CPU。因为全屏的图像数据非常多,比较下去,每秒N次,CPU 忙不过来。 2.2. VNC 的方法:用 HOOK ,当 WINDOWS 重绘屏幕的时候,会给出消息。抓住这个消息,能够获得屏幕变化的 Rect 坐标。当然,这个消息来得非常快,没必要每个这样的消息你都抓图去传输。VNC 是合并多个这样的消息的 RECT 区块,然后将合并后的区块的屏幕抓下来,这样就不是全屏,只是一部分屏幕。然后,再将抓下来的,和上次屏幕同一个区块的比较一次,变了的,才发。VNC 这里是分 64X64的小方块来比较的。 2.3. 更进一步,HOOK 的效率还是低。如果能够用虚拟显卡驱动来获取屏幕变化,效率更高。 3. 有必要每秒30祯吗?屏幕要一直不变化,你每秒1祯都不应该有。So....你应该怎么处理呢?
----------------------------------------------
-
作者:
2016/7/29 13:11:18
81楼:
求楼上老人家 办法 1 的 代码 DEMO。 感谢 楼上老人家 2.2 的说明。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/7/15 16:20:30
82楼:
pcplayer 大侠, 厉害啊!!!
----------------------------------------------
kittyapp
作者:
2017/9/9 20:32:21
83楼:
苹果茶网络共享v3.3绿色版 http://www.aptea.top 可直接借助Windows远程桌面等进行远程访问,无须路由进行端口映射。 QQ群:548267270 苹果茶网络共享与管理
----------------------------------------------
-
作者:
2017/9/10 14:47:44
85楼:
哇,无比佩服楼主。
----------------------------------------------
-
作者:
glwang (glwang)
★☆☆☆☆
-
盒子活跃会员
2019/2/11 17:18:17
86楼:
“陳經韜”好熟悉的名字,好像在原来的Delphi大富翁网站里面的
----------------------------------------------
作者:
hexi (Hexi)
★☆☆☆☆
-
盒子活跃会员
2019/2/11 22:35:59
87楼:
提供个思路:可以研究通过显卡编程进行比较及压缩处理,这样CPU可能占用可以接近0,帧频也高。
----------------------------------------------
-
作者:
2019/2/18 15:38:58
88楼:
Windows桌面共享中一些常见的抓屏技术 http://www.cppblog.com/weiym/archive/2013/12/01/204536.html
----------------------------------------------
-
作者:
2019/2/18 15:56:33
89楼:
DXGI快速截屏录屏技术 http://www.cnblogs.com/haibindev/archive/2017/12/20/8072409.html
----------------------------------------------
-
作者:
2019/12/8 9:30:18
90楼:
传输速度只是远程控制的一部分而已,例如未登陆状态时桌面还未创建,如何读取登陆前的屏幕。
----------------------------------------------
简单做人,认真做事。
作者:
2019/12/8 13:24:38
91楼:
俺03年的时候做过,参考 UltraVNC 的方法。用 Delphi 做的。效率不是很高,但至少以那时候的 CPU 能力和那时候的网络带宽,能传。 现在来看,CPU 已经比较厉害了,如果压缩采用 H.264 来压缩图像,可能压缩后的数据量更小。当然 H.264 的压缩比较消耗 CPU,需要CPU足够好。 楼上有人说用显卡编程来做大数据量的图像运算,这个思路很好。但如果俺们仅仅用 Delphi 就搞不定了。
----------------------------------------------
-
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2019/12/8 14:07:02
92楼:
pcplayer 牛!
----------------------------------------------
-我的博客
作者:
2019/12/8 16:33:56
93楼:
计算机图形学算法的范畴...早期的电视机成像原理...可以去参考下。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2020/4/13 15:03:13
94楼:
89 楼的文章我读了一下,确实是一个快速截屏的好技术。问题是如果要传输,则仍然需要想办法压缩数据。 压缩数据,如果能采用 GPU 当然就厉害了,节约 CPU 的时间。 采用 GPU,不知道在 DELPHI 底下,采用一些 OpenGL 的代码会不会最终计算是 GPU 计算?
----------------------------------------------
-
作者:
2020/4/25 14:14:23
95楼:
94楼,目前已经有很多好的压缩算法,比如H264等,对于点对点,单播的话普通lz,zlib,gzip就能处理得特别好,如今的处理器运算与网络传输已经相当快了,压缩等不是啥大问题了。
----------------------------------------------
-
作者:
2022/8/12 11:16:12
96楼:
天,2005年帖子被刨坑出来了。
----------------------------------------------
-
作者:
2023/8/9 20:59:07
97楼:
// 抓屏逻辑 HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); int screenWidth = GetDeviceCaps(hScreenDC, HORZRES); int screenHeight = GetDeviceCaps(hScreenDC, VERTRES); HDC hMemDC = CreateCompatibleDC(hScreenDC); HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, screenWidth, screenHeight); HGDIOBJ hOldObj = SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, screenWidth, screenHeight, hScreenDC, 0, 0, SRCCOPY); for (int i = 0; i < screenHeight; i++) { COLORREF* pixels = new COLORREF[screenWidth]; GetBitmapBits(hBitmap, screenWidth * 4, pixels); // 发送本行的像素数据pixels到远程 delete [] pixels; } SelectObject(hMemDC, hOldObj); DeleteDC(hMemDC); DeleteObject(hBitmap); DeleteDC(hScreenDC); // 显屏逻辑 HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); // 接收远程发送来的像素数据到pixels int screenWidth = GetDeviceCaps(hScreenDC, HORZRES); int screenHeight = GetDeviceCaps(hScreenDC, VERTRES); HDC hMemDC = CreateCompatibleDC(hScreenDC); HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, screenWidth, screenHeight); HGDIOBJ hOldObj = SelectObject(hMemDC, hBitmap); for (int i = 0; i < screenHeight; i++) { // 获取第i行的像素数据pixels SetBitmapBits(hBitmap, screenWidth * 4, pixels); } BitBlt(hScreenDC, 0, 0, screenWidth, screenHeight, hMemDC, 0, 0, SRCCOPY); SelectObject(hMemDC, hOldObj); DeleteDC(hMemDC); DeleteObject(hBitmap); DeleteDC(hScreenDC); 可以用Delphi试着写一个高压缩率的自定义图像压缩算法,关键点包括: 分块编码 将图像分成多个小块,每个块单独压缩编码,可以提高压缩率。 色彩抽样 每隔几行几列取一个像素的颜色值,然后用这些颜色值来表示块内的主要色调。 差异编码 只编码相邻像素之间的颜色差值,而不是直接存储颜色值,减少冗余。 运动预估 如果是视频,可以根据前后帧预测当前帧的运动向量,只 coding 运动矢量。 熵编码 使用霍夫曼编码等统计方法,给出现频率高的符号分配更短的码字。
----------------------------------------------
《Z-Gantt智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET