2017-02-08 3 views
0

Je veux créer un sélecteur de couleur. Donc, je pensais que l'utilisation NSReadPixel serait une bonne approche pour recevoir la couleur des pixels. Donc ce que je l'ai fait essentiellement était le suivant:NSReadPixel() renvoie toujours

class CustomWindowController: NSWindowController { 

    override func mouseMoved(with event: NSEvent) { 

     let mouseLocation = NSEvent.mouseLocation() 
     let pickedColor = NSReadPixel(mouseLocation) 

    } 

} 

Mais pickedColor retourne toujours nil. Même si j'essaie de "lire Pixel" avec un point fixe (à des fins de test), il renvoie toujours nil. Qu'est-ce que je rate?

EDIT # 1

J'ai suivi la NSBitmapImageRep/colorAt approche des réponses et a remarqué que le NSColor semble être un peu différent (dans la plupart des cas plus lumineux) résultant qu'il devrait être (prendre un regarde la capture d'écran). Dois-je considérer colorSpaces ou autre? (Et comment)

enter image description here

EDIT # 2

Got ça marche - bitmap.colorSpaceName = NSDeviceRGBColorSpace le tour est joué.

Répondre

1

Cela ne fonctionne vraiment pas. J'utilise ce code pour obtenir la couleur de pixel

NSPoint _point = [NSEvent mouseLocation]; 

CGFloat x = floor(_point.x); 
CGFloat y = [NSScreen mainScreen].frame.size.height - floor(_point.y); 
//it needs because AppKit and CoreGraphics use different coordinat systems 

CGWindowID windowID = (CGWindowID)[self windowNumber]; 

CGImageRef pixel = CGWindowListCreateImage(CGRectMake(x, y, 1, 1), kCGWindowListOptionOnScreenBelowWindow, windowID, kCGWindowImageNominalResolution); 

NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:pixel]; 
CGImageRelease(pixel); 

NSColor *color = [bitmap colorAtX:0 y:0]; 
+0

Fonctionne parfaitement bien. Merci beaucoup! – ixany

+0

J'ai remarqué que la couleur résultante n'est pas exactement la même que dans le pixel choisi (voir mon édition ci-dessus). Pourriez-vous s'il vous plaît être si gentil et jeter un coup d'oeil? Merci d'avance! :) – ixany

+0

Essayez de le calibrer - créez une image avec des couleurs différentes et explorez avec votre sélecteur. Peut être x ± 1 y ± 1 résoudre votre problème. –