NSReadPixel() 总是 returns 无
NSReadPixel() always returns nil
我想创建一个颜色选择器。所以我认为使用 NSReadPixel
是接收像素颜色的好方法。所以我基本上做的是:
class CustomWindowController: NSWindowController {
override func mouseMoved(with event: NSEvent) {
let mouseLocation = NSEvent.mouseLocation()
let pickedColor = NSReadPixel(mouseLocation)
}
}
但是pickedColor
总是returnsnil
。即使我尝试使用固定点 "readPixel"(出于测试目的),它仍然 returns nil
。我错过了什么?
编辑#1
我从答案中遵循了 NSBitmapImageRep
/ colorAt
方法并注意到生成的 NSColor 似乎与它应该的有点不同(在大多数情况下更亮)(采取看截图)。我是否必须考虑 colorSpaces 左右? (以及如何?)
编辑 #2
成功了 - bitmap.colorSpaceName = NSDeviceRGBColorSpace
成功了。
真的不行。我使用此代码获取像素颜色
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];
我想创建一个颜色选择器。所以我认为使用 NSReadPixel
是接收像素颜色的好方法。所以我基本上做的是:
class CustomWindowController: NSWindowController {
override func mouseMoved(with event: NSEvent) {
let mouseLocation = NSEvent.mouseLocation()
let pickedColor = NSReadPixel(mouseLocation)
}
}
但是pickedColor
总是returnsnil
。即使我尝试使用固定点 "readPixel"(出于测试目的),它仍然 returns nil
。我错过了什么?
编辑#1
我从答案中遵循了 NSBitmapImageRep
/ colorAt
方法并注意到生成的 NSColor 似乎与它应该的有点不同(在大多数情况下更亮)(采取看截图)。我是否必须考虑 colorSpaces 左右? (以及如何?)
编辑 #2
成功了 - bitmap.colorSpaceName = NSDeviceRGBColorSpace
成功了。
真的不行。我使用此代码获取像素颜色
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];