关于使用 Objective C 在屏幕上获取点的颜色的困惑
Confusion about getting color of a point on screen with Objective C
我正在尝试使用 cocoa 应用从屏幕上的像素获取颜色值。这个想法是应用程序应该能够在屏幕上的任何位置获取颜色值,甚至在应用程序本身的范围之外。
我做了很多研究,这就是我正在做的事情
- (void) keepRunning:(NSTimer *)timer{
NSPoint mouseLoc = [NSEvent mouseLocation];
uint32_t count = 0;
CGDirectDisplayID displayForPoint;
if (CGGetDisplaysWithPoint(NSPointToCGPoint(mouseLoc), 1, &displayForPoint, &count) != kCGErrorSuccess)
{
NSLog(@"Break");
return;
}
CGImageRef image = CGDisplayCreateImageForRect(displayForPoint, CGRectMake(mouseLoc.x-10, mouseLoc.y-10, 1, 1));
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
CGImageRelease(image);
NSColor* color = [bitmap colorAtX:0 y:0];
NSLog(@"%@", color);
}
keepRunning 每 100 毫秒左右触发一次。这似乎是这样做的正确方法。问题是,我没有得到正确的颜色值。输出的所有值都是灰色的,基本上是错误的。关于我做错了什么的任何想法?跟透明度有关系吗?
我稍微更改了您的代码并将其放入我的动画计时器中。这似乎有效。请注意,我只创建了一个 1 像素的图像并翻转了 mouseLoc.y 值。
CGFloat screenHeight = 900.0; // This is the display height of my machine
NSPoint mouseLoc = [NSEvent mouseLocation];
uint32_t count = 0;
CGDirectDisplayID displayForPoint;
if (CGGetDisplaysWithPoint(NSPointToCGPoint(mouseLoc), 1, &displayForPoint, &count) != kCGErrorSuccess)
{
NSLog(@"Break");
return;
}
CGImageRef image = CGDisplayCreateImageForRect(displayForPoint, CGRectMake(mouseLoc.x, screenHeight - mouseLoc.y, 1, 1)); // mouseLoc.y is flipped
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
CGImageRelease(image);
NSColor* color = [bitmap colorAtX:0 y:0];
NSLog(@"%@", color);
我正在尝试使用 cocoa 应用从屏幕上的像素获取颜色值。这个想法是应用程序应该能够在屏幕上的任何位置获取颜色值,甚至在应用程序本身的范围之外。
我做了很多研究,这就是我正在做的事情
- (void) keepRunning:(NSTimer *)timer{
NSPoint mouseLoc = [NSEvent mouseLocation];
uint32_t count = 0;
CGDirectDisplayID displayForPoint;
if (CGGetDisplaysWithPoint(NSPointToCGPoint(mouseLoc), 1, &displayForPoint, &count) != kCGErrorSuccess)
{
NSLog(@"Break");
return;
}
CGImageRef image = CGDisplayCreateImageForRect(displayForPoint, CGRectMake(mouseLoc.x-10, mouseLoc.y-10, 1, 1));
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
CGImageRelease(image);
NSColor* color = [bitmap colorAtX:0 y:0];
NSLog(@"%@", color);
}
keepRunning 每 100 毫秒左右触发一次。这似乎是这样做的正确方法。问题是,我没有得到正确的颜色值。输出的所有值都是灰色的,基本上是错误的。关于我做错了什么的任何想法?跟透明度有关系吗?
我稍微更改了您的代码并将其放入我的动画计时器中。这似乎有效。请注意,我只创建了一个 1 像素的图像并翻转了 mouseLoc.y 值。
CGFloat screenHeight = 900.0; // This is the display height of my machine
NSPoint mouseLoc = [NSEvent mouseLocation];
uint32_t count = 0;
CGDirectDisplayID displayForPoint;
if (CGGetDisplaysWithPoint(NSPointToCGPoint(mouseLoc), 1, &displayForPoint, &count) != kCGErrorSuccess)
{
NSLog(@"Break");
return;
}
CGImageRef image = CGDisplayCreateImageForRect(displayForPoint, CGRectMake(mouseLoc.x, screenHeight - mouseLoc.y, 1, 1)); // mouseLoc.y is flipped
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
CGImageRelease(image);
NSColor* color = [bitmap colorAtX:0 y:0];
NSLog(@"%@", color);