Как реализовать пользовательское представление изображения для NSImage

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам