Как реализовать пользовательское представление изображения для 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:
метод, вам нужно будет назначить пиксели только один раз.