【问题标题】:cocoa: Read pixel color of NSImage可可:读取 NSImage 的像素颜色
【发布时间】:2012-03-15 18:36:03
【问题描述】:

我有一个NSImage。我想阅读NSColor 以获取某个 x 和 y 处的像素。 Xcode 似乎在 NSImage 上有一个 colorAtX:y: 方法,但这会导致崩溃,说 NSImage 没有这样的方法。我见过一些例子,你创建一个NSBitmapImageRep 并在上面调用相同的方法,但我无法成功地将我的NSImage 转换为NSBitmapImageRepNSBitmapImageRep 上的像素由于某种原因不同。

必须有一个简单的方法来做到这一点。不可能这么复杂。

【问题讨论】:

  • “NSBitmapImageRep 上的像素”有何不同?我以前也这样做过,效果很好。
  • 见下面 Rob Keniger 的回答。 NSImage 的锚点(原点)在左上角,NSBitmapImageRep 在左下角。当您从一个转换到另一个时,图像坐标会垂直翻转。

标签: cocoa nsimage nscolor nsbitmapimagerep


【解决方案1】:

没有看到您的代码,很难知道出了什么问题。

您可以使用initWithData: 方法将图像绘制到NSBitmapImageRep 并传入图像的TIFFRepresentation

然后可以使用colorAtX:y:的方法获取像素值,这是NSBitmapImageRep的方法,而不是NSImage

NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithData:[yourImage TIFFRepresentation]];
NSSize imageSize = [yourImage size];
CGFloat y = imageSize.height - 100.0;
NSColor* color = [imageRep colorAtX:100.0 y:y];
[imageRep release];

请注意,您必须对y 值进行调整,因为colorAtX:y 方法使用从图像左上角开始的坐标系,而NSImage 坐标系从左下角开始。

或者,如果像素在屏幕上可见,那么您可以使用NSReadPixel() 函数获取当前坐标系中像素的颜色。

【讨论】:

  • 好的,我正在尝试这种方式,但似乎有些不对劲。 NSBitmapImageRep 的坐标系与 NSImage 不同吗?一切似乎都被垂直翻转了。似乎 NSImage 是从左下角绘制的(就像默认情况下视图一样),而 NSBitmapImageRep 是从左上角绘制的(因此翻转图像)。我实际上并没有在屏幕上绘图,所以我看不到。
  • 看来你是对的,坐标被翻转了。我已经添加了代码来解释我的答案。
  • 感谢您的帮助罗。我在编辑图像时遇到了另一个障碍,发现我必须从更改后的 NSBitmapImageRep 创建一个新的 NSImage 实例。所以我的代码最终是沿着从 NSImage 创建 NSBitmapImageRep、读取像素、更改像素、从更改的 NSBitmapImageRep 创建 NSImage、分配新的 NSImage 到视图。感谢您的帮助!
  • 请注意,您可能希望使用 imageRep.pixelsWide 和 imageRep.pixelsHigh,因为它们与分辨率无关。当使用本示例中的大小时,它不一定与您尝试读取的像素相对应。
  • 谢谢@NathanS。 -- 我只是被那个烧伤了:)
【解决方案2】:

NSBitmapImageRep 的函数colorAtX 似乎没有使用设备颜色空间,这可能导致颜色值与您实际看到的略有不同。使用此代码在当前设备颜色空间中获取正确的颜色:

[yourImage lockFocus]; // yourImage is just your NSImage variable
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point
[yourImage unlockFocus];

【讨论】:

  • 您能提供更多信息吗? '不总是导致完全正确的颜色'是什么意思?
  • @walteronassis:我稍微改变了答案
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 2013-05-07
  • 2011-05-22
  • 2010-10-10
  • 1970-01-01
  • 2017-08-17
相关资源
最近更新 更多