Обзор vImage
vImage является двухмерным изображением, обрабатывающим платформу. Часть Ускорять Платформы, vImage обеспечивает, оптимизированные подпрограммы для функций, таких как изображение фильтрует, scalings, отражения и вращения. В то время как его функции совместно используют несколько общностей с другими платформами обработки изображений, такими как Базовое Изображение, что различает, vImage от остальных - то, что оно использует векторизованный код. Если Ваш код работает на процессоре G5, vImage использует в своих интересах AltiVec. Если это работает на основанном на Intel Mac, vImage использует SSE. При работе архитектуры G3 (который не обладает векторным процессором), он будет все еще работать, только без векторной оптимизации. Путем использования в своих интересах CPU’s встроенный векторный процессор, vImage является самой быстрой доступной платформой обработки изображений с OS X v.10.5.
Когда использовать vImage
Если обработка изображений в реальном времени является потребностью в Вашем приложении, необходимо использовать vImage. Обязательно используйте временные буферы, когда доступно, чтобы избежать блокировать на вызовах к malloc()
.
Кроме применения эффектов к изображениям, vImage является также подходящим для приложений, требующих непротиворечивых, совместимых стандартами арифметических результатов.
Вообще говоря, vImage является средством экономии времени, но существуют определенные затраты, связанные с использованием специализированного векторного процессора и кэшей данных для обработки изображений. Например, это не было бы практично для использования vImage для обработки единственной, фотографии среднего размера. В то время как vImage совершенно способен к выполнению такой обработки, ее преимущество находится в обработке изображений в режиме реального времени или повторении работы последовательно. Если Вы не имеете дело с большими, изображениями с высокой разрешающей способностью, базовое Изображение является лучшим выбором.
Поскольку vImage является чистой платформой C, нет никаких классов для отслеживания, только функции, форматы изображения и типы данных. Все функции vImage начинаются со слова «vImage» сопровождаемый именем работы. Некоторые функции также имеют подчеркивание (“_ “) на их имена. Символы, следующие за подчеркиванием обычно, указывают формат изображения, на который работает функция.
Форматы изображения, Доступные в vImage
vImage поддерживает несколько форматов изображений. Форматы изображения являются спецификациями для того, как пиксельные данные представлены в памяти. Форматы файла образа являются определенными типами файлов (такими как JPG, PNG, GIF и TIFF) раньше обменивался данными изображения между программами и хранил их на жестком диске. Платформам нравится Изображение, I/O помогает Вам в загрузке различных форматов файла образа от диска и использования их в памяти. В памяти изображения сохранены как двухмерные антенные решетки интенсивностей пикселей (типа int
или float
). Существует один пиксель в массиве для каждого пикселя в изображении.
Форматы изображения являются или планарными или чередованы. Планарный формат изображения хранит данные изображения так, чтобы данные для каждого канала (плоскость) были в отдельном буфере. Например, типичное планарное изображение имело бы отдельные буферы для красных, зеленых, синих, и альфа-каналов. Чередованный формат изображения хранит данные изображения так, чтобы чередовались данные от каждого пикселя: ARGBARGBARGB...
Значения данных для изображений могут быть целым числом или с плавающей точкой. В vImage форматы изображения, использующие целочисленные значения, представляют уровень яркости как 8-разрядное значение без знака. Значения могут колебаться от 0 до 255, включительно, с 255 указывающей полной интенсивностью и 0 никакой интенсивностью. Форматы изображения, использующие значения с плавающей точкой обычно, используют значения в диапазоне 0,0 (самая низкая интенсивность) к 1,0 (полная интенсивность). Однако vImage не осуществляет это ограничение диапазона и не отсекает вычисленные значения, лежащие вне этого диапазона.
vImage использует следующие форматы изображения для своих базовых операций:
Planar8 изображение является единственным каналом (один цвет или альфа-значение). Каждый пиксель является 8-разрядным значением целого без знака. Тип данных для этого формата изображения
Pixel_8
.PlanarF изображение является единственным каналом (один цвет). Каждый пиксель является 32-разрядным значением с плавающей точкой. Тип данных для этого формата изображения
Pixel_F
.ARGB8888 изображение имеет четыре чередованных канала, для альфы, красной, зеленой, и синей, в том порядке. Каждый пиксель составляет 32 бита, массив четырех 8-разрядных целых без знака. Тип данных для этого формата изображения
Pixel_8888
.ARGBFFFF изображение имеет четыре чередованных канала, для альфы, красной, зеленой, и синей, в том порядке. Каждый пиксель является массивом четырех чисел с плавающей точкой. Тип данных для этого формата изображения
Pixel_FFFF
.RGBA8888 изображение имеет четыре чередованных канала, для красного, зеленого, синего цвета, и альфа, в том порядке. Каждый пиксель составляет 32 бита, массив четырех 8-разрядных целых без знака. Тип данных для этого формата изображения
Pixel_8888
.RGBAFFFF изображение имеет четыре чередованных канала, для красного, зеленого, синего цвета, и альфа, в том порядке. Каждый пиксель является массивом четырех чисел с плавающей точкой. Тип пиксельных данных для этого формата изображения
Pixel_FFFF
.
Можно также использовать vImage для обработки изображений в других форматах первым преобразованием их к одному из базовых форматов изображения vImage. Например, Вы могли взять изображение, определенное с помощью 16-разрядных пикселей, и преобразовать его в 32-разрядный формат пикселя, поддерживаемый vImage использование функции преобразования как vImageConvert_16SToF
. Эти функции могут помочь Вам преобразовать изображения в и от не поддерживаемые форматы и поддерживаемые:
Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из 16-разрядных целых чисел со знаком к буферному, содержащему значения с плавающей точкой.Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из 16-разрядных целых без знака к буферному, содержащему значения с плавающей точкой.Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из значений с плавающей точкой к буферному, содержащему 16-разрядные целые числа со знаком.Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из значений с плавающей точкой к буферному, содержащему 16-разрядных целых без знака.vImageConvert_16UtoPlanar8
Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из 16-разрядных целых без знака к буферному, содержащему 8-разрядные целочисленные значения.vImageConvert_Planar8to16U
Преобразовывает планарное (или чередованный — умножаются
vImage_Buffer.width
4)vImage_Buffer
из 8-разрядных целочисленных значений к буферному, содержащему 16-разрядные значения целого без знака.vImageConvert_ARGB1555toPlanar8
Преобразовывает изображения на 16 битов на пиксель (с 1-разрядным альфа-каналом и 5-разрядными красными, зелеными, и синими каналами) к формату Planar8.
vImageConvert_ARGB1555toARGB8888
Преобразовывает изображения на 16 битов на пиксель (с 1-разрядным альфа-каналом и 5-разрядными красными, зелеными, и синими каналами) к формату ARGB8888.
vImageConvert_Planar8toARGB1555
Преобразовывает изображения Planar8 в изображения на 16 битов на пиксель с 1-разрядными альфа-каналами и 5-разрядными красными, зелеными, и синими каналами.
vImageConvert_ARGB8888toARGB1555
Преобразовывает изображения ARGB8888 в изображения на 16 битов на пиксель с 1-разрядными альфа-каналами и 5-разрядными красными, зелеными, и синими каналами.
Преобразовывает изображения на 16 битов на пиксель с 5-разрядными красными каналами, 6-разрядными зелеными каналами и 5-разрядными синими каналами к формату Planar8.
vImageConvert_RGB565toARGB8888
Преобразовывает изображения на 16 битов на пиксель с 5-разрядными красными каналами, 6-разрядными зелеными каналами и 5-разрядными синими каналами к формату ARGB8888.
Преобразовывает изображения Planar8 в изображения на 16 битов на пиксель с 5-разрядными красными каналами, 6-разрядными зелеными каналами и 5-разрядными синими каналами.
vImageConvert_ARGB8888toRGB565
Преобразовывает изображения ARGB8888 в изображения на 16 битов на пиксель с 5-разрядными красными каналами, 6-разрядными зелеными каналами и 5-разрядными синими каналами.
vImageConvert_Planar16FtoPlanarF
Преобразовывает планарные изображения, содержащие 16-разрядные значения с плавающей точкой к 32-разрядным значениям с плавающей точкой.
vImageConvert_PlanarFtoPlanar16F
Преобразовывает планарные изображения, содержащие 32-разрядные значения с плавающей точкой к 16-разрядным значениям с плавающей точкой.
Типы данных и 64-разрядная обработка
Начиная с версии 10.4 OS X поддерживает 64-разрядное обращение для тех приложений, скомпилированных для 64-разрядной архитектуры. vImage платформа исходно поддерживает 64-разрядную архитектуру, что означает, что все функции vImage, доступные в OS X v10.4 и позже, доступны и для 32-разрядных и для 64-разрядных приложений. 32-разрядные приложения будут продолжать работать как всегда. Для 64-разрядных процессоров vImage принимает изображения с буферами, более крупными, чем 4 gigapixels широких или высокие (или оба), и передает данные с 64-разрядными указателями.
vImage использует несколько непрозрачных типов данных для упрощения обрабатывающих необработанных данных изображения. Большинство типов данных является просто определениями типов для int
или float
массивы. Если Вы пишете совместно использованный исходный код, предназначающийся и для 32-разрядной и 64-разрядной архитектуры, необходимо быть осторожны относительно использования типов с vImage. Некоторые типы в vImage изменяют размер между этими двумя архитектурой, прежде всего vImage_Error
, size_t
, vImagePixelCount
, что-либо с типом long
или unsigned long
, и конечно, указатели. Эти типы составляют 64 бита в 64-разрядной архитектуре и 32 бита для 32-разрядной архитектуры. Необходимо удостовериться, что собственные типы растут и уменьшаются соответственно для предотвращения усечения. Необходимо соблюдать особую осторожность о данных, которые могли бы быть переданы между архитектурой, такой как данные, хранившие к диску, или отправили по сети. См. vImage Ссылку Типов данных и Констант для получения дополнительной информации.
Для получения дополнительной информации о 64-разрядном программировании в OS X посмотрите 64-разрядное Руководство по Переходу.