Как реализовать пользовательское представление изображения для NSImage - PullRequest
1 голос
/ 18 ноября 2011

Я разрабатываю приложение для рисования и обработки определенного формата изображения, который в настоящее время не поддерживается классом NSimage.В этом конкретном формате изображения находятся в форме 1D двоичной таблицы, которой предшествует заголовок ASCII, который описывает данные (размерность, размер изображения, бит на пиксель, ...).

В Coco Drawing Guide я прочитал, что можно создать новое представление изображения.Я новичок в программировании на Coca и Objectiv-C и по этой теме нахожу объяснение Coco Drawing Guide очень коротким и не очень полезным для меня.Теперь я заинтересован в том, чтобы получить больше подробностей с примером кода о том, как создать новое представление изображения.Также меня особенно интересует понимание того, как переписать метод initWithData и Draw, чтобы приложение Cocoa правильно интерпретировало новое представление изображения.

Кто-нибудь знает, поделитесь со мной ссылкой, где метод описан более подробно?

1 Ответ

1 голос
/ 18 ноября 2011

Если все, что вы хотите сделать, это нарисовать свой формат изображения и не особенно заботиться о том, чтобы снова вытащить его из своего приложения, лучше всего забыть о создании подкласса NSImageRep и просто создать NSBitmapImageRep снемного глубины и размеров, соответствующих вашему изображению.Затем вы запрашиваете у него значение -bitmapData.

, которое даст вам необработанный буфер, к которому вы можете обратиться напрямую, и затем вы буквально скопируете каждый из пикселей вашего изображения один за другим в соответствующие места.в буфере.

Если вы действительно хотите использовать пользовательский NSImageRep, тогда все, что вам нужно сделать, это подкласс NSImageRep, а затем в вашем методе initWithData: вы сохраните данные изображения в ivar изатем вызовите все различные методы, чтобы сообщить представителю изображения, как он должен быть сконфигурирован, например -setBitsPerSample:, -setPixelsHigh: и т. д. Документация для класса NSImageRep объясняет, какие методы следует вызывать при инициализации изображения.

Для реализации -draw вам буквально нужно нарисовать ваши пиксели в текущем контексте.Очевидно, то, как вы это сделаете, зависит от типа изображения, которое вы рисуете (например, векторный формат будет иметь совсем другой код для рисования, чем растровый).

Один из способов нарисовать растровое изображение - это циклический просмотр.пиксели и вызовите NSRectFill() с прямоугольником размером в один пиксель для каждого пикселя, что довольно быстро, хотя и не особенно эффективно.

Однако вам будет лучше создать NSBitmapImageRep и манипулироватьпикселей в контексте растрового изображения (возвращается из -bitmapData) напрямую.Затем вы можете просто нарисовать CGImageRep, который вы можете получить из NSBitmapImageRep.Если вы создадите NSBitmapImageRep в своем методе initWithData:, вам нужно будет назначить пиксели только один раз.

...