我正在尝试创建一个应用程序,当屏幕上像素的颜色变为另一个(我知道它是什么)它做了什么,对它的作用并不重要。
无论如何,我正在使用它:
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.1s)(如上例所示),它不起作用。
它停留在那里的时间不应该是一个问题,因为我的应用程序正在快速检查像素,如调试中所示:
2010-01-04 22:12:58.230 appname[2372:a0f] Checked
2010-01-04 22:12:58.231 appname[2372:a0f] Checked
有什么想法吗? :)
答案 0 :(得分:2)
正如gs所指出的,这不是微不足道的。您可能想看看Apple CIColorTracking示例,该示例使用自定义Core Image过滤器来检测运动图像中的像素:
http://developer.apple.com/mac/library/samplecode/CIColorTracking/
有关于如何在这里完成的更多信息:
答案 1 :(得分:0)
移动物体可能永远不会到达那个点。您的显示器的更新频率约为50赫兹,如果单个像素行进速度超过50像素/秒它将不会出现在每个像素上!
对于视频缓冲区也是如此,因为所有图纸在Mac OS X中都是双缓冲的,每秒更新50次。