热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

抓取屏幕,分析屏幕上的目标小图片位置,代码犀利,速度很快

原文:http:www.codeproject.comArticles25025Screen-Scraper-in-Managed-CodeScreenScraperinManaged

原文:http://www.codeproject.com/Articles/25025/Screen-Scraper-in-Managed-Code

Screen Scraper in Managed Code

核心代码:

public List findImages()
{
Bitmap bm = getDesktopBitmap();
BitmapData bmd = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height),
ImageLockMode.ReadOnly, bm.PixelFormat);
List results = new List();
foundRects = new List();

for (int y = 0; y {
byte* scanline = (byte*)bmd.Scan0 + (y * bmd.Stride);

for (int x = 0; x {
int xo = x * PIXLESIZE;
byte[] buff = { scanline[xo], scanline[xo + 1],
scanline[xo + 2], 0xff };
int val = BitConverter.ToInt32(buff, 0);

// Pixle value from subimage in desktop image
if (pixels.ContainsKey(val) && notFound(x, y))
{
Point loc = (Point)pixels[val];

int sx = x - loc.X;
int sy = y - loc.Y;
// Subimage occurs in desktop image
if (imageThere(bmd, sx, sy))
{
Point p = new Point(x - loc.X, y - loc.Y);
results.Add(p);
foundRects.Add(new Rectangle(x, y, bmImage.Width,
bmImage.Height));
}
}
}
}

return results;
}

private bool imageThere(BitmapData bmd, int sx, int sy)
{
int ix;

for (int iy = 0; iy {
// Horizontal line of pixles in the bitmap data
byte* scanline = (byte*)bmd.Scan0 + ((sy + iy) * bmd.Stride);

for (ix = 0; ix {
// Offset into the scan line
int xo = (sx + ix) * PIXLESIZE;
// Convert PixelFormat.Format24bppRgb
// to PixelFormat.Format32bppArgb
byte[] buff = { scanline[xo], scanline[xo + 1],
scanline[xo + 2], 0xff };
// Pixle value
int val = BitConverter.ToInt32(buff, 0);

if (val != image[ix, iy])
return false;
}
ix = 0;
}

return true;
}

private bool notFound(int x, int y)
{
Point p = new Point(x, y);
foreach (Rectangle r in foundRects)
{
if (r.Contains(p))
return false;
}

return true;
}

获取屏幕图片

private static Bitmap getDesktopBitmap()
{
SendKeys.SendWait("^{PRTSC}");
Bitmap bm = new Bitmap(Clipboard.GetImage());
Clipboard.Clear();
return bm;
}


demo:

桌面


我从右侧的广告上截了个小图:


用工具查找下:


很是牛B吧,作者本来打算用来分析网页源码的,这么搞也是很有想法。

几点注意的地方:

There are a couple of things to keep in mind when using this program:
Requires the images loaded are in 32 bit ARGB format
The time it takes to run is dependent on the existence of a good unique pixel value
On a 2 GHz Athelon with a 15.4'' screen, about .5 sec. for most images
About 30 sec. for small white images and white screen background
The Print Screen functionality was only tested on Windows XP, and may not work the same on Vista, etc.




推荐阅读
  • 常用API-Hashtable类及其与HashMap、HashSet的区别转载请表明出处:http:blog.csdn.netu012637501(嵌入式_小J的天空)一、Hashtable&l ... [详细]
  • (2.1.8)Java之集合类:set、list、hashmap、hashtable等和迭代器iterator
    一、容器常见的集合类有这些种:实现Collection接口的:Set、List以及他们的实现类。实现Map接口的:HashMap及其实现类编程爱好者学习,下面我我们通过一个图来整体描述一下:这个图片没 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 一、HashMap1.HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是 ... [详细]
  • 要讨论这些常用的默认初始容量和扩容的原因是:当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复 ... [详细]
  • HashMap和Hashtable的区别主要的区别有三点:线程安全性,同步(synchronization),以及速度。(两者都是无序排放)HashMap几乎可以等价于Hashtable,除了Hash ... [详细]
  • HashMap及HashTable源码解析HashMap在java和Android经常使用到,之前学过数据结构,理解了它的原理,却很 ... [详细]
  • 用户购买商品时if(e.CommandName.ToLower()"buy"){判断用户购物车是否为空如果为空则分配 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
author-avatar
Z-RZI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有