热门标签 | 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.




推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复hashMap是hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区 ... [详细]
  • 常用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及其实现类编程爱好者学习,下面我我们通过一个图来整体描述一下:这个图片没 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 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"){判断用户购物车是否为空如果为空则分配 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
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社区 版权所有