2

我正在尝试创建一个应用程序,当屏幕上的像素颜色变为另一种颜色时(我知道它是什么),它会做一些事情,对于它的作用并不重要。

无论如何,我正在使用这个:

 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];

然后,我希望它变成这里的颜色:

NSColor *color = [NSColor colorWithCalibratedRed:0.521569 green:0.380392 blue:0.231373 alpha:1];

我在这里比较颜色:

while (![color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {
 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];
 if ([color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {

我知道 while/if 部分可以做得更好,但它应该工作得很好,不用担心优化应用程序,直到它真正工作大声笑。

现在,例如,如果像素的颜色实际上并没有快速变化(就像颜色保持一段时间一样),它就可以完美地工作。如果它就像一个像素,其颜色会四处移动并达到 283*420 但不会长时间停留在那里(如 0.1 秒)(如上例所述),它就不起作用。

它停留在那里的时间应该没有问题,因为我的应用程序检查像素的速度非常快,如下面的调试所示:

2010-01-04 22:12:58.230 appname[2372:a0f] Checked
2010-01-04 22:12:58.231 appname[2372:a0f] Checked

有任何想法吗?:)

4

2 回答 2

2

正如 gs 指出的那样,这并非微不足道。您可能想看看 Apple CIColorTracking 示例,它使用自定义核心图像过滤器来检测运动图像中的像素:

http://developer.apple.com/mac/library/samplecode/CIColorTracking/

这里有更多关于它是如何完成的信息:

http://parmanoir.com/How_Core_Image_Color_Tracking_works

于 2010-01-05T00:31:27.420 回答
0

一个移动的物体可能永远不会到达那个点。您的显示器的更新频率约为 50 赫兹,如果单个像素的传输速度超过 50 像素/秒,它不会出现在每个像素上!

视频缓冲区也是如此,因为所有绘图在 Mac OS X 中都是双缓冲的,每秒更新 50 次。

于 2010-01-04T22:29:02.920 回答