【发布时间】:2020-10-21 17:16:24
【问题描述】:
我正在尝试从我的 NSImage(png 文件)中获取特定点的 CGColor。这个函数在 NSViews 上调用,它可以拖到我的 NSImageView 上。然后这个函数应该将一个变量(defaultColor)设置为颜色,它恰好位于 NSImageView 上的 NSView 的位置。为了进行测试,我将每个 NSView 着色为之前存储在变量中的颜色(因此,对于 NSView 位于 NSImageView 上的颜色)。 您如何在屏幕截图中看到例如我在 NSImageView 中显示了包含四种不同颜色的 300x300 图像。颜色将被正确检测,但颜色似乎是水平交换的。当 NSView 在底部时测量顶部的颜色,当 NSView 在顶部时测量底部的颜色。
字节顺序错了吗?我怎么能换这个?我已经读过How do I get the color of a pixel in a UIImage with Swift? 和Why do I get the wrong color of a pixel with following code?。那是我使用的代码的地方,我做了一些改动:
func setDefaulColor(image: NSImage)
{
let posX = self.frame.origin.x + (self.frame.width / 2)
let posY = self.frame.origin.y + (self.frame.height / 2)
var r: CGFloat = 0
var g: CGFloat = 0
var b: CGFloat = 0
var a: CGFloat = 1
if posX <= image.size.width && posY <= image.size.height
{
var imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let imageRef = image.cgImage(forProposedRect: &imageRect, context: nil, hints: nil)
var pixelData = imageRef!.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = Int(posY) * imageRef!.bytesPerRow + Int(posX) * 4
r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
}
self.defaultColor = CGColor(red: r, green: g, blue: b, alpha: a)
setNeedsDisplay(NSRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
}
以下是一些截图:
NSImageView 显示的 PNG 文件应该是 RGBA 格式。你怎么能看到我认为从像素数据中提取的颜色:
r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
但似乎像素数据的加载顺序错误?
您知道如何更改数据顺序或为什么会发生这种情况吗?
【问题讨论】:
-
也许这与 macOS 上的坐标系有关?该代码是为 iOS 应用程序编写的,在 iOS 上,0,0 点位于左上角,在 macOS 上,0,0 点似乎位于左下角。我如何在 macOS 上管理这个?
标签: ios swift macos image colors