2012-04-30 4 views
5

У меня есть куча файлов изображений в собственном двоичном формате, который я хочу загрузить в NSImages. Формат не является простым растровым изображением, а скорее своего рода RLE-представлением, смешанным с прозрачностью и разной дополнительной информацией.Рекомендуемый подход для загрузки собственного файла двоичного изображения в NSImage?

Чтобы отобразить одно из этих изображений в приложении Cocoa, мне нужен способ для синтаксического анализа байта файла изображения байтом и «вычисления» растрового изображения, которое затем будет помещено в NSImage.

Что такое хороший подход для этого в Objective-C/Cocoa?

ответ

7

Задачи интерпретации данных изображения обрабатываются объектом (объектами) изображения. Чтобы использовать проприетарный формат, у вас есть несколько вариантов: (a) создать пользовательский класс представления, (b) использовать NSCustomImageRep с пользовательским делегатом или (c) использовать настраиваемый объект для перевода изображения в поддерживаемый формат, например необработанное растровое изображение.

Если вы решите создать пользовательский класс представления, вы создадите подкласс NSImageRep, как описано в Creating New Image Representation Classes. Это в основном требует, чтобы ваш класс регистрировался и мог рисовать данные изображения. В дополнение к этому вы можете переопределить методы для возврата информации об изображении, и вы сможете создавать копии изображений с помощью обычных методов NSImage. Этот метод требует наибольшей работы.

Использование NSCustomImageRep требует меньше работы, чем создание пользовательской реализации. Ваш объект делегата должен иметь возможность рисовать изображение в фиксированном месте. Однако вы не можете вернуть другую информацию об изображении, и вам нужно будет создать объект NSCustomImageRep вручную, прежде чем создавать NSImage.

Перевод изображения в другой формат также проще, чем создание пользовательского представления. Это может быть так же просто, как создание пустого NSImage нужного размера и его рисование. Создание образа еще сложнее, так как вам нужно вызвать ваш метод перевода, и это повлияет на эффективность (как на будущее время рисования, так и на использование памяти), так как вы меняете форматы, что может быть хорошим или плохим. Вы также потеряете связь между объектом изображения и его источником.

+0

Хорошее резюме доступных вариантов, спасибо! Что касается третьего варианта: мне нужно было бы сделать преобразование один раз, создав «NSImage», правильно? Как это повлияет на будущее время рисования? Кроме того, что является наиболее эффективным способом рисования в «NSImage»? Я где-то читал о решении, которое включало создание объекта «NSColor» каждый раз, когда был написан пиксель. Это не кажется слишком эффективным, поскольку мне нужно обработать несколько сотен мегабайт данных изображения. – tajmahal

+0

@tajmahal Да, вы сделали бы только рисунок один раз. В будущем рисунок будет выполнен с использованием любого формата, в который вы конвертировали, что, вероятно, будет как можно быстрее, если вы просто рисуете изображение. Если ваш формат является растровым форматом, вы можете «нарисовать» его, изменив его в формат растрового формата «NSImage» вместо того, чтобы создавать цветные объекты и рисовать отдельные пиксели. Если ваш формат является векторным, вы хотите использовать методы рисования Cocoa или функции Core Graphics для его рисования. У CG также есть объекты затенения, которые позволяют выделять цвет в каждом пикселе через функцию. – ughoavgfhw

Смежные вопросы