какао: считывание цвета пикселя NSImage - PullRequest
5 голосов
/ 15 марта 2012

У меня есть NSImage.Я хотел бы прочитать NSColor для пикселя в некоторых х и у.Xcode, кажется, считает, что на NSImage существует метод colorAtX:y:, но это вызывает сбой, говоря, что такого метода для NSImage не существует.Я видел несколько примеров, когда вы создаете NSBitmapImageRep и вызываете тот же метод для этого, но я не смог успешно преобразовать мой NSImage в NSBitmapImageRep.Пиксели на NSBitmapImageRep почему-то отличаются.

Должен быть простой способ сделать это.Это не может быть так сложно.

Ответы [ 2 ]

9 голосов
/ 16 марта 2012

Не видя ваш код, трудно понять, что происходит не так.

Вы можете нарисовать изображение в NSBitmapImageRep с помощью метода initWithData: и передать в 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 начинается в левом нижнем углу. 1017 *

В качестве альтернативы, если пиксель виден на экране, вы можете использовать функцию NSReadPixel(), чтобы получить цвет пикселя в текущей системе координат.

1 голос
/ 23 января 2018

Функция colorAtX из NSBitmapImageRep, похоже, не использует цветовое пространство устройства, что может привести к значениям цвета, которые немного отличаются от того, что вы на самом деле видите.Используйте этот код для получения правильного цвета в цветовом пространстве текущего устройства:

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