Модуль изображения и его части

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

Перед запуском этой главы Вы должны быть знакомы с понятиями, описанными в Базовом Руководстве по программированию Изображения, уже использовали некоторые встроенные фильтры обработки изображений, предоставленные Базовым Изображением, и понимаете классы, определенные Базовым Изображением API (см. Базовый Ссылочный Набор Изображения).

Главные части модуля изображения

Фильтр обработки изображений, когда упаковано как исполнимый модуль изображения, имеет три главных части:

Разделение труда

Задачи обработки изображений разделены на низкий уровень (ядро) и высокий уровень (Objective C) задачи. Когда Вы сначала начинаете писать модули изображения, Вы могли бы найти, что он бросающий вызов разделил задачи соответственно. Если Вы стремитесь сохранить kernel наклон подпрограмм, Вы, вероятно, преуспеете в том, чтобы делить задачи соответственно.

A kernel подпрограмма воздействует на отдельные пиксели и использует GPU (предполагающий, что каждый доступен). Для лучшей производительности, a kernel подпрограмма должна максимально фокусироваться на пиксельной обработке. Любой устанавливал работу или вычисления, которые могут быть сделаны вне kernel подпрограмма должна быть сделана вне kernel подпрограмма, в Objective C фильтруют файлы. Как Вы будете видеть, потому что Базовое Изображение ожидает, что определенные задачи будут выполнены вне kernel подпрограмма, шаблон плагина модуля изображения XCode обеспечивает методы, установленные в просто этой цели. В записи Части Objective C Вы видите специфические особенности, но на данный момент, общее понимание - все, в чем Вы будете нуждаться.

Это задачи, обычно выполняемые в файлах фильтра Objective C:

Правила подпрограммы ядра

A kernel подпрограмма походит на работника на конвейере — она специализируется на фокусируемой задаче. Каждый раз, когда подпрограмма вызывается, она производит a vec4 тип данных от материалов (входные параметры) данный ему. Подпрограмма должна выполнить как можно меньше работы, чтобы быть эффективной. Когда работники используют заранее смонтированные субкомпоненты, конвейерная работа идет самая быстрая. Это - также истина kernel подпрограммы. Что-либо, что может быть вычислено заранее и передано подпрограмме, должно быть. Поскольку Вы становитесь более опытными при записи kernel подпрограммы, Вы разработаете умные способы срезать код в подпрограмме. Примеры в записи Ядер должны дать Вам некоторое представление. Базовое Изображение также помогает в этом отношении путем ограничения того, какие виды операций могут быть сделаны в a kernel подпрограмма.

Помните следующий, как Вы разрабатываете и пишете kernel подпрограммы:

Таблица 1-1 перечисляет допустимые входные параметры для a kernel подпрограмма и связанные объекты, которые должны быть переданы подпрограмме ядра от части Objective C модуля изображения. Базовое Изображение извлекает надлежащий базовый тип данных из высокоуровневого объекта Objective C, который Вы предоставляете. Если Вы не используете объект, фильтр может неожиданно выйти. Например, если, в части Objective C модуля изображения, Вы передаете значение с плавающей точкой непосредственно вместо того, чтобы упаковать его как NSNumber объект, Ваш фильтр не будет работать. Фактически, когда Вы используете инструмент Image Unit Validator на таком модуле изображения, сбоях модуля изображения с загадочным сообщением. (См. Проверку Модуля Изображения.)

Таблица 1-1  Kernel стандартные входные параметры и их связанные объекты

Входной параметр подпрограммы ядра

Объект

sampler

CISampler

__table sampler

CISampler

__color

CIColor

float

NSNumber

vec2, vec3, или vec4

CIVector

Методы области интереса

Область интереса (ROI) является областью исходных данных сэмплера, которые Ваше ядро использует для его обработки на пиксель. A kernel подпрограмма всегда возвращает a vec4 тип данных — т.е. один пиксель. Однако подпрограмма может воздействовать на любое число пикселей для создания этого vec4 тип данных. Если отображение между источником и местом назначения не является непосредственным, то необходимо определить метод области интереса в файле фильтра Objective C.

Вам не нужен метод ROI когда a kernel подпрограмма:

Необходимо предоставить метод ROI когда a kernel подпрограмма:

Вы предоставляете метод ROI для каждого kernel подпрограмма в модуле изображения, которому нужны Вы. (Модуль изображения может содержать один или больше kernel подпрограммы.) Каждый метод ROI, который Вы предоставляете, должен использовать сигнатуру метода следующей формы:

- (CGRect) regionOf:(int)samplerIndex
            destRect:(CGRect)r
            userInfo:obj;

Можно заменить regionOf с надлежащим именем. Например, метод ROI для фильтра размытия можно было назвать blurROI:destRect:userInfo:.

Базовое Изображение вызывает Ваш метод ROI в надлежащих случаях, передавая ему sampler индекс (о котором Вы узнаете больше позже), прямоугольник для области, представляемой, и любые данные, которые необходимы Вашей подпрограмме. Метод должен определить ROI для каждого sampler источник данных, используемый kernel подпрограмма. Если a sampler источник данных, используемый kernel подпрограмма не требует метода ROI, тогда можно пасовать назад destRect прямоугольник для этого sampler. Вы просто проверяете samplerIndex значение передало методу. Если вычисление ROI является потребностью в sampler, выполните вычисление и пасуйте назад надлежащий прямоугольник. Если вычисление ROI не необходимо для той детали sampler, тогда пасуйте назад destRect переданный методу.

Например, если Ваш kernel стандартные пиксели доступов в радиусе r вокруг текущей цели необходимо сместить целевой прямоугольник в методе ROI радиусом r. Вы будете видеть, как все это работает более подробно позже.

Следующие шаги

Теперь, когда у Вас есть общее представление о том, что главные части модуля изображения и что каждый делает, Вы готовы идти дальше к записи kernel подпрограммы. Запись Ядер запускается с некоторых простых kernel подпрограммы и прогресс к более сложным. Не только будет Вы se, как записать kernel подпрограммы, но Вы будете видеть, как можно протестировать простой kernel подпрограммы без потребности обеспечить код Objective C.