Работа с местами назначения изображения

Место назначения изображения абстрагирует задачу записи данных и избавляет от необходимости Вас управлять данными через необработанный буфер. Место назначения изображения может представлять единственное изображение или повторные изображения. Это может содержать изображения миниатюр, а также свойства для каждого изображения. После создания CGImageDestination возражают для соответствующего места назначения (URL, объект CFData или Кварцевый потребитель данных), можно добавить данные изображения и установить свойства изображения. Когда Вы закончены, добавив данные, вызываете функцию CGImageDestinationFinalize.

Установка свойств места назначения изображения

Функция CGImageDestinationSetProperties добавляет словарь (CFDictionaryRef) из свойств (пары ключ/значение) к изображениям в месте назначения изображения. Несмотря на то, что установка свойств является дополнительной, существует много ситуаций, для которых Вы захотите установить их. Например, если Ваше приложение позволит пользователям добавлять ключевые слова к изображениям или насыщенности изменения, воздействию или другим значениям, то Вы захотите сохранить ту информацию в словаре опций.

Изображение I/O определяет обширный набор ключей для указания таких вещей как качество сжатия, фоновый цвет составления композита, ключи словаря Exif, значения цветовой модели, ключи словаря GIF, Nikon и ключи камеры Canon и еще много. Посмотрите Ссылку CGImageProperties.

При установке словаря у Вас есть два выбора. Можно или создать объект CFDictionary, или можно создать NSDictionary объект, затем снимает его в качестве a CFDictionaryRef когда Вы передаете словарь опций функции CGImageDestinationSetProperties. (CFDictionary и NSDictionary являются взаимозаменяемыми, или бесплатный соединенный мостом.) Перечисление 3-1 показывает фрагмент кода, присваивающий пары ключ/значение для трех свойств, затем создающий словарь, содержащий те свойства. Поскольку это - фрагмент кода, необходимые вызовы для выпуска CFNumber и объектов CFDictionary, создаваемых кодом, не показаны. Когда Вы пишете свой код, необходимо вызвать CFRelease когда Вам больше не нужен каждый из этих объектов.

При установке пары ключ/значение для свойства необходимо консультироваться со справочной документацией (см. Ссылку Ссылки и CGImageProperties CGImageDestination) для ожидаемого типа данных значения. Как Вы видите в Перечислении 3-1, численные значения обычно должны обертываться в объект CFNumber. При использовании Базовых типов Основы для значений словаря можно также предоставить константы обратного вызова при создании словаря —kCFTypeDictionaryKeyCallBacks и kCFTypeDictionaryValueCallBacks. (См. ссылку CFDictionary.)

Перечисление 3-1  , Устанавливающее свойства места назначения изображения

float compression = 1.0; // Lossless compression if available.
int orientation = 4; // Origin is at bottom, left.
CFStringRef myKeys[3];
CFTypeRef   myValues[3];
CFDictionaryRef myOptions = NULL;
myKeys[0] = kCGImagePropertyOrientation;
myValues[0] = CFNumberCreate(NULL, kCFNumberIntType, &orientation);
myKeys[1] = kCGImagePropertyHasAlpha;
myValues[1] = kCFBooleanTrue;
myKeys[2] = kCGImageDestinationLossyCompressionQuality;
myValues[2] = CFNumberCreate(NULL, kCFNumberFloatType, &compression);
myOptions = CFDictionaryCreate( NULL, (const void **)myKeys, (const void **)myValues, 3,
                      &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// Release the CFNumber and CFDictionary objects when you no longer need them.

Запись изображения месту назначения изображения

Чтобы записать изображение месту назначения, сначала необходимо создать целевой объект изображения путем вызова CGImageDestinationCreateWithURL, CGImageDestinationCreateWithData, или CGImageDestinationCreateWithDataConsumer функции. Необходимо предоставить UTI получающегося файла образа. Можно или предоставить UTI или эквивалентную константу, если один при наличии. Посмотрите Таблицу 1-1.

После создания места назначения изображения можно добавить изображение к нему путем вызова CGImageDestinationAddImage или CGImageDestinationAddImageFromSource функции. Если формат целевого файла изображения поддерживает повторные изображения, можно неоднократно добавлять изображения. Вызывание функции CGImageDestinationFinalize I/O Изображения сигналов, что Вы закончены, добавив изображения. После того, как завершенный, Вы не можете больше добавлять данные к месту назначения изображения.

Перечисление 3-2 показывает, как Вы могли бы реализовать метод для записи файла образа. Несмотря на то, что это перечисление показывает, как использовать место назначения изображения из метода Objective C, можно столь же легко создать и использовать место назначения изображения в процедурной функции C. Параметр опций включает любые свойства, которые Вы хотите указать для изображения, такого как настройки сжатия или камера.

Перечисление 3-2  метод, пишущий изображение в URL

- (void) writeCGImage: (CGImageRef) image toURL: (NSURL*) url withType: (CFStringRef) imageType andOptions: (CFDictionaryRef) options
{
   CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((CFURLRef)url, imageType, 1, nil);
   CGImageDestinationAddImage(myImageDest, image, options);
   CGImageDestinationFinalize(myImageDest);
   CFRelease(myImageDest);
}