Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cocoa:读取NSImage的像素颜色_Cocoa_Nsimage_Nscolor_Nsbitmapimagerep - Fatal编程技术网

cocoa:读取NSImage的像素颜色

cocoa:读取NSImage的像素颜色,cocoa,nsimage,nscolor,nsbitmapimagerep,Cocoa,Nsimage,Nscolor,Nsbitmapimagerep,我有一个NSImage。我想在x和y方向读一个像素的NSColor。Xcode似乎认为在NSImage上有一个colorAtX:y:方法,但这会导致崩溃,说NSImage没有这样的方法。我见过一些示例,其中您创建了一个NSBitmapImageRep,并对其调用了相同的方法,但我无法成功地将我的NSImage转换为NSBitmapImageRep。由于某些原因,NSBitmapImageRep上的像素不同 必须有一个简单的方法来做到这一点。它不可能这么复杂。如果不查看代码,就很难知道出了什么问题

我有一个
NSImage
。我想在x和y方向读一个像素的
NSColor
。Xcode似乎认为在
NSImage
上有一个
colorAtX:y:
方法,但这会导致崩溃,说NSImage没有这样的方法。我见过一些示例,其中您创建了一个
NSBitmapImageRep
,并对其调用了相同的方法,但我无法成功地将我的NSImage转换为
NSBitmapImageRep
。由于某些原因,
NSBitmapImageRep
上的像素不同


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

如果不查看代码,就很难知道出了什么问题

您可以使用
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
坐标系从左下角开始


或者,如果像素在屏幕上可见,则可以使用该函数获取当前坐标系中像素的颜色。
NSBitmapImageRep
的函数
colorAtX
似乎没有使用设备颜色空间,这可能导致颜色值与实际看到的颜色略有不同。使用此代码可在当前设备颜色空间中获得正确的颜色:

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

“NSBitmapImageRep上的像素”有什么不同?我以前也这样做过,并取得了很好的效果。请参见下面罗布·凯尼格的答案。NSImage的定位点(原点)位于左上角,NSBitmapImageRep位于左下角。当你从一个转换到另一个时,图像坐标会垂直翻转。可能是Ok的重复,所以我试着这样做,但似乎有些不对劲。NSBitmapImageRep的坐标系是否与NSImage不同?一切似乎都是垂直翻转的。NSImage似乎是从左下角绘制的(与默认情况下的视图类似),NSBitmapImageRep是从左上角绘制的(从而翻转图像)。我没有画到屏幕上,所以我看不见。看来你是对的,坐标被翻转了。我已经在我的答案中添加了相应的代码。谢谢你的帮助。在编辑图像时,我遇到了另一个路障,发现我必须从修改后的NSBitmapImageRep创建一个新的NSImage实例。因此,我的代码最终遵循了从NSImage创建NSBitmapImageRep、读取像素、更改像素、从更改的NSBitmapImageRep创建NSImage、将新NSImage分配给视图等步骤。谢谢你的帮助!请注意,您可能希望使用imageRep.pixelsWide和imageRep.pixelsHigh,因为它们与分辨率无关。当使用本例中的大小时,它不一定与您试图读取的像素相对应。谢谢@NathanS。--我被这句话激怒了:)你能再多给我一点信息吗?“并非总是能得到准确的颜色”是什么意思?@walteronassis:我的答案有点改变