2015-03-18 9 views
1

Я экспортирую анимированный gif с помощью быстрой настройки Mac OS, которая работает, но свойства, которые я установил, не применяются. Я настроил свои свойства и при входе их, они появляются как так:CGImageDestination не принимает свойства

{ 
HasGlobalColorMap = 1; 
LoopCount = 0; 
} 

В цикле я добавить каждый кадр по назначению:

CGImageDestinationAddImage(destination, cgGif, gifProperties as CFDictionaryRef) 

Затем после цикла я пытаюсь установите свойства еще один раз и доработайте пункт назначения:

CGImageDestinationSetProperties(destination, gifProperties as CFDictionaryRef) 
      if (!CGImageDestinationFinalize(destination)) { 
      NSLog("failed to finalize image destination") 
     } 

Однако результирующее изображение не настроено на цикл. Почему это так?

ответ

4

На самом деле, я сделал некоторый прогресс ...

я установка параметров, как это:

 var imageProperties:NSMutableDictionary = NSMutableDictionary() 
    imageProperties.setObject(NSNumber(float: 0.1), forKey: kCGImagePropertyGIFDelayTime as NSString) 
    imageProperties.setObject(NSNumber(bool: false), forKey: kCGImagePropertyHasAlpha as NSString) 
    imageProperties.setObject(NSString(string: "kUTTypeGIF"), forKey: kCGImageSourceTypeIdentifierHint as NSString) 
    imageProperties.setObject(NSNumber(bool: false), forKey: kCGImagePropertyGIFImageColorMap as NSString) 
    imageProperties.setObject(NSNumber(bool: true), forKey: kCGImageSourceShouldCache as NSString) 
    let nestedImageProperties:NSDictionary = [imageProperties: kCGImagePropertyGIFDictionary] 
    println("nestedImageProperties: \(nestedImageProperties)") 

Который дает мне эту структуру:

nestedImageProperties: { 
    { 
    DelayTime = "0.1"; 
    HasAlpha = 0; 
    ImageColorMap = 0; 
    kCGImageSourceShouldCache = 1; 
    kCGImageSourceTypeIdentifierHint = kUTTypeGIF; 
} = "{GIF}"; 
} 

я нашел a implementation, который определил следующие свойства:

let fileProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: 0]] 
let frameProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFDelayTime as String: 1.0]] 

давая эту структуру:

Frame Properties: [{GIF}: [DelayTime: 1.0]] 
File Properties: [{GIF}: [LoopCount: 0]] 

Затем я применил fileProperties к месту назначения:

CGImageDestinationSetProperties(destination, fileProperties as CFDictionaryRef) 

и frameProperties друг изображений, как это было добавлено:

CGImageDestinationAddImage(destination, imageRef, frameProperties as CFDictionaryRef) 

и, наконец, он работает, они применяются.

Не пробовал несколько объектов недвижимости, но должен быть в порядке.

+0

Я не понимал, что должен был установить разные свойства для рамки и изображения, TY! Если вы хотите, чтобы ваши несколько свойств работали, вам просто нужно изменить объявление nestedImageProperties на это: let nestedImageProperties = [kCGImagePropertyGIFDictionary as String: imageProperties] таким образом вы получите {"{GIF}" = {props}} вместо этого наоборот, как и в структуре, которую вы опубликовали. – John

+0

Не беспокойтесь, да, это правильный способ объявить ключ: значение в словаре;) Когда-то я скучаю по невероятно очевидным, ура. – theSiberman