какао: считывать цвет пикселя NSImage

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

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


person mtmurdock    schedule 15.03.2012    source источник
comment
Чем отличаются пиксели в NSBitmapImageRep? Я делал это раньше и добился хороших результатов.   -  person user1118321    schedule 16.03.2012
comment
См. Ответ Роба Кенигера ниже. Точка привязки (источник) NSImage находится в верхнем левом углу, а NSBitmapImageRep - в нижнем левом углу. При преобразовании из одного в другое координаты изображения переворачиваются по вертикали.   -  person mtmurdock    schedule 19.03.2012
comment
возможный дубликат Получить пиксели и цвета из NSImage   -  person smokris    schedule 21.07.2014


Ответы (2)


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

Вы можете нарисовать изображение в 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 начинается в нижнем левом углу.

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

person Rob Keniger    schedule 16.03.2012
comment
Хорошо, я пытаюсь это сделать, но что-то не так. Отличается ли система координат NSBitmapImageRep от NSImage? Вроде бы все перевернуто по вертикали. Казалось бы, NSImage рисуется из левого нижнего угла (например, view по умолчанию), а NSBitmapImageRep рисуется из левого верхнего угла (таким образом, переворачивая изображение). На самом деле я не рисую на экране, поэтому не вижу. - person mtmurdock; 16.03.2012
comment
Похоже, вы правы, координаты перевернуты. Я добавил код, чтобы учесть это в своем ответе. - person Rob Keniger; 17.03.2012
comment
Спасибо за помощь, Роб. Я столкнулся с другим препятствием при редактировании изображения и обнаружил, что мне нужно создать новый экземпляр NSImage из измененного NSBitmapImageRep. Таким образом, мой код в конечном итоге соответствовал строкам создания NSBitmapImageRep из NSImage, чтения пикселей, изменения пикселей, создания NSImage из измененного NSBitmapImageRep, назначения нового NSImage для просмотра. Спасибо за помощь! - person mtmurdock; 19.03.2012
comment
Обратите внимание, что вы можете использовать imageRep.pixelsWide и imageRep.pixelsHigh, поскольку они не зависят от разрешения. При использовании размера, как в этом примере, он не обязательно соответствует пикселям, которые вы пытаетесь прочитать. - person Nathan S.; 11.04.2015
comment
Спасибо @NathanS. - Я просто обгорел от этого :) - person chinabuffet; 20.09.2015

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

[yourImage lockFocus]; // yourImage is just your NSImage variable
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point
[yourImage unlockFocus];
person Ely    schedule 23.01.2018
comment
Не могли бы вы дать немного дополнительной информации? Что означает «не всегда приводит к точному правильному цвету»? - person asdf; 10.03.2018
comment
@walteronassis: я немного изменил свой ответ - person Ely; 10.03.2018