2015-01-24 2 views
0

Я пытаюсь получить значение цвета из пикселя на экране с помощью приложения для какао. Идея заключается в том, что приложение должно иметь возможность получать значение цвета в любом месте экрана, даже вне сферы применения самого приложения.Путаница о получении цвета точки на экране с Objective C

Я сделал кучу исследований, и это, по сути, что я делаю

- (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 мс. Кажется, это правильный способ сделать это. Проблема в том, что я не получаю правильные значения цвета. Все выведенные значения являются серыми и в основном неправильными. Любые идеи о том, что я делаю неправильно? Это как-то связано с прозрачностью?

ответ

0

Я немного изменил код и поместил его в свой таймер анимации. Кажется, это работает. Обратите внимание, что я создаю только 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); 
+0

Вы правы, что местоположение мыши нужно перевернуть. Однако вы должны сделать это для вызова 'CGGetDisplaysWithPoint()' тоже. Чтобы правильно получить высоту экрана, используйте 'NSHeight ([NSScreen.screens.firstObject frame])'. В интересах OP, 'NSPointToCGPoint()' только преобразует точку между двумя типами. Он не настраивается для разных систем координат. –

+0

Удивительный! Он отлично работает. Я вообще не думал о координирующей системе. – Gibtardo

Смежные вопросы