Dot Net下实现屏幕图像差异获取v2.0

简介:

      前几篇利用类似隔行扫描的方式实现了对屏幕图像差异的获取,并基于该算法实现了一个屏幕传输程序,通过使用该屏幕传输程序,明显感受到该算法的性能存在一定的不足,因此需要改进。最近参考了DG大哥DGScreenSpy_0.4e版的算法实现了分块的方式。由于还没有实现基于此算法的屏幕传输程序,所以目前还无法断然认为该算法一定优于隔行的方式。不过,从当前对该算法的测试数据上来看,估计可以达到20帧每秒(不考虑网络传输等的影响)。

      按照惯例应该先帖几张效果图,但是发现和之前发布的图像差异获取v1.0中的图片相差无几,所以就不帖了。直接来看下文。

      我们对两幅图像的比较,可以逐个像素比较,也可以先把图像分块,然后比较对应块中的数据。那么,到底分块是什么个概念,又该如何分块,分块后的数据如何比较呢?下面我将逐一进行介绍。

     分块也就是说把图片分成“几乘几”的小块,如图1所示一幅200*80的图像。按横向划分4块,纵向划分2块的方式,可以画出一个二行四列的网格,其中每一格就是分块数据。

screenshare-v2-1图1

      看起来似乎很简单,其实实现上也很简单,^_^。在Dot Net中,Bitmap类有一个很好用的方法就是Clone,该方法的其中一个重载方法为:public Bitmap Clone(Rectangle rect, PixelFormat format); 怎么样?知道怎么做了吧。你只需要建立一个图像数组用于存储所有块数据,然后其中的每一个块数据均通过Clone方法从母图像中获取。

      分块后的数据其实仍然是一个图像,怎么比较这个图像呢?我第一次接触到分块算法的时候,就愣住了,难道对于分块数据仍然采用像素扫描的方式?研究了DG的算法后才发现自己太天真了。对于分块数据,可以直接在内存中进行比较,这种比较方式速度最快。说到这里,不知道是否有朋友会有疑问:“既然内存中比较速度最快,那为什么还要搞隔行、分块呢?”,答案很简单,因为我们不止是要比较出不同,更重要的是要把不同的部分加以利用。不管是隔行还是分块,目的都是为了能最小化变化的区域,只有这样才能有效降低网络负载。

      如果对上述内容理解清楚了,那接下来就来看下分块的思路。这个思路主要还要感谢DG的算法。

      首先对原图进行分块的初始化,经过这步之后会得到一个最原始的分块数组。然后拿该分块数组与第二张图片进行内存比较。比较的时候,并非逐个分块进行比较,而是有选择的进行比较,这种选择建立在三种假设的基础上:

     1. 鼠标所在的块会发生变化;

     2. 当一个块变化的时候,该块周围的块也会发生变化;

     3. 图片第一行和最后一行会发生变化;

     当比较出不同的时候,即可以采取我们想要的一些行为。另外,要注意的就是选择一个合适分块粒度(即你要把图像分成“几乘几”)。如果分块多,则每一个分块的数据量就小,但是比较的次数就会变多。如果分块少,则每一个分块的数据量较多,但是比较次数就会变少。因此选择一个合适的粒度会影响程序的性能,据文献资料的记载和他人的尝试,一般认为把屏幕分成16*8块最为合适。

      说了这么多,下面来看下关键代码吧:

初始化所有分块的数据

查找差异的块

      注:该实现由于并不是特地为了实现屏幕传输,所以在比较的时候,我利用了Clone方式获取第二张图片的对应块。该方式需要耗时0.015s左右,因此比较100块图像就会额外使用1.5s左右的时间。







本文转自stg609博客园博客,原文链接:http://www.cnblogs.com/stg609/archive/2009/12/15/1625126.html,如需转载请自行联系原作者


目录
相关文章
.NET Core:使用ImageSharp跨平台处理图像
一.简述 ImageSharp是一个新的跨平台2D图形API,旨在处理图像而不使用System.Drawing。 二.安装 目前ImageSharp还是处于alpha版本,所以我们需要在nuget中添加它的地址:https://www.
2347 0
|
8月前
|
机器学习/深度学习 数据采集 存储
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
141 0
|
11月前
|
机器学习/深度学习 算法 光互联
致敬何凯明的暗通道去雾算法 | NAS-Net: 基于非对齐监督的图像去雾框架
致敬何凯明的暗通道去雾算法 | NAS-Net: 基于非对齐监督的图像去雾框架
243 0
|
文字识别 数据处理 C++
使用.NET开发一个屏幕OCR工具
本文将介绍使用.NET开发的一款桌面截图 OCR 工具,软件已开源,地址:[https://github.com/sangyuxiaowu/Snipping_OCR](https://github.com/sangyuxiaowu/Snipping_OCR)
179 0
使用.NET开发一个屏幕OCR工具
|
安全 搜索推荐 数据安全/隐私保护
用.NET设计一个假装黑客的屏幕保护程序
本文主要介绍屏幕保护程序的一些相关知识,以及其在安全方面的用途,同时介绍了如何使用 .NET 开发一款屏幕保护程序,并对核心功能做了介绍,案例代码开源:https://github.com/sangyuxiaowu/HackerScreenSaver
140 0
用.NET设计一个假装黑客的屏幕保护程序
【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取
目前M3的开发板,虽然前段时间可以支持WPF了,但是SRAM毕竟还是有限,所以从串口摄像头直接获取的jpg图像,并不能在LCD屏上显示出来(在模拟器上没有这个问题,可以直接呈现),所以我借助蓝牙接口,把另一个串口获取的图像数据发送到一台带蓝牙的PC上,PC上的程序否则实现数据接收,并把图像呈现出来。
706 0
|
PHP Windows
一起谈.NET技术,使用DeeepZoom Composer进行富图像应用的开发(翻译--2)
  Deep Zoom程序设计      到目前为止,你已经见识了Deep Zoom Composer工具,也见到了Deep Zoom 多图像的浏览器应用程序。不过你可能还需要知道怎样设计这样的程序。   因此,在这一节中,你将能够在Silverlight中开发Deep Zoom程序,可以用Deep Zoom Composer工具来创建图像瓷片,而且你也能够将它们集成到你自己的Silverlight应用程序中,下面的过程将显示MultiScaleImage控件来展示这个过程。
1024 0
|
Web App开发 PHP
一起谈.NET技术,使用DeeepZoom Composer进行富图像应用的开发(翻译--1)
  富图像应用(第一部分)   在这章,你会学到下列内容: 使用Deep Zoom Composer 工具建立高质量、高度友好的图像。 组合为平滑、可缩放的全景图像。 建立以编程形式方式控制的深度缩放的Silverlight应用程序。
1105 0
|
存储 测试技术