2010-12-09 57 views

Répondre

13

Vous pouvez utiliser CGDisplayCreateImageForRect pour obtenir un CGImageRef qui englobe le point qui vous intéresse. Une fois que vous avez une CGImage, vous pouvez en extraire une valeur de couleur en la rendant dans un tampon personnalisé ou en utilisant initWithCGImage de NSBitmapImageRep. puis colorAtX: y :. Le code « écrit dans la fenêtre de code de débordement de pile » pour la méthode NSBitmapImageRep ressemblerait à quelque chose comme:

NSColor *MyColorAtScreenCoordinate(CGDirectDisplayID displayID, NSInteger x, NSInteger y) { 
    CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(x, y, 1, 1)); 
    NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image]; 
    CGImageRelease(image); 
    NSColor *color = [bitmap colorAtX:0 y:0]; 
    [bitmap release]; 
} 

qui renverra probablement la couleur dans l'espace couleur de l'appareil. Il peut être utile de renvoyer la couleur dans l'espace colorimétrique RBG calibré à la place.

+3

Il devrait être [bitmap colorAtX: 0 y: 0] Je crois. –

+0

Oui, il devrait être 0, 0. Pourtant, "écrit dans la fenêtre de code de débordement de pile". –

0

Essayez NSReadPixel. Vous devez obtenir l'emplacement actuel de la souris et le convertir en un cadre de référence de coordonnées approprié. Une fois que vous avez la couleur, vous devrez peut-être le convertir en un espace de couleur différent, en fonction de vos besoins.

+0

Cela fonctionnera pour les vues et les fenêtres de votre espace d'adressage sur lesquelles vous avez verrouillé le focus, mais vous ne pourrez pas lire les pixels d'écran provenant d'autres processus. –