Задачи интерпретации данных изображения обрабатываются объектом (объектами) изображения. Чтобы использовать проприетарный формат, у вас есть несколько вариантов: (a) создать пользовательский класс представления, (b) использовать NSCustomImageRep
с пользовательским делегатом или (c) использовать настраиваемый объект для перевода изображения в поддерживаемый формат, например необработанное растровое изображение.
Если вы решите создать пользовательский класс представления, вы создадите подкласс NSImageRep
, как описано в Creating New Image Representation Classes. Это в основном требует, чтобы ваш класс регистрировался и мог рисовать данные изображения. В дополнение к этому вы можете переопределить методы для возврата информации об изображении, и вы сможете создавать копии изображений с помощью обычных методов NSImage
. Этот метод требует наибольшей работы.
Использование NSCustomImageRep
требует меньше работы, чем создание пользовательской реализации. Ваш объект делегата должен иметь возможность рисовать изображение в фиксированном месте. Однако вы не можете вернуть другую информацию об изображении, и вам нужно будет создать объект NSCustomImageRep
вручную, прежде чем создавать NSImage
.
Перевод изображения в другой формат также проще, чем создание пользовательского представления. Это может быть так же просто, как создание пустого NSImage
нужного размера и его рисование. Создание образа еще сложнее, так как вам нужно вызвать ваш метод перевода, и это повлияет на эффективность (как на будущее время рисования, так и на использование памяти), так как вы меняете форматы, что может быть хорошим или плохим. Вы также потеряете связь между объектом изображения и его источником.
Хорошее резюме доступных вариантов, спасибо! Что касается третьего варианта: мне нужно было бы сделать преобразование один раз, создав «NSImage», правильно? Как это повлияет на будущее время рисования? Кроме того, что является наиболее эффективным способом рисования в «NSImage»? Я где-то читал о решении, которое включало создание объекта «NSColor» каждый раз, когда был написан пиксель. Это не кажется слишком эффективным, поскольку мне нужно обработать несколько сотен мегабайт данных изображения. – tajmahal
@tajmahal Да, вы сделали бы только рисунок один раз. В будущем рисунок будет выполнен с использованием любого формата, в который вы конвертировали, что, вероятно, будет как можно быстрее, если вы просто рисуете изображение. Если ваш формат является растровым форматом, вы можете «нарисовать» его, изменив его в формат растрового формата «NSImage» вместо того, чтобы создавать цветные объекты и рисовать отдельные пиксели. Если ваш формат является векторным, вы хотите использовать методы рисования Cocoa или функции Core Graphics для его рисования. У CG также есть объекты затенения, которые позволяют выделять цвет в каждом пикселе через функцию. – ughoavgfhw