У меня такая очень странная проблема. Я создаю анимированные gifs от UIImages, и большую часть времени они выходят правильно. Однако, когда я начинаю получать изображения большего размера, мои цвета начинают исчезать. Например, если я делаю 4-х кратное 32 x 32-пиксельное изображение с не более чем 10 цветами, никаких проблем. Если я масштабирую одно изображение до 832 x 832, я теряю розовый цвет, а коричневый становится зеленым.
@1x 32 x 32
@10x 320 x 320
@26x 832 x 832
Вот код, который я использую для создания gif...
var kFrameCount = 0
for smdLayer in drawingToUse!.layers{
if !smdLayer.hidden {
kFrameCount += 1
}
}
let loopingProperty = [String(kCGImagePropertyGIFLoopCount): 0]
let fileProperties: [String: AnyObject] = [String(kCGImagePropertyGIFDictionary): loopingProperty as AnyObject];
let frameProperty = [String(kCGImagePropertyGIFDelayTime): Float(speedLabel.text!)!]
let frameProperties: [String: AnyObject] = [String(kCGImagePropertyGIFDictionary): frameProperty as AnyObject];
let documentsDirectoryPath = "file://\(NSTemporaryDirectory())"
if let documentsDirectoryURL = URL(string: documentsDirectoryPath){
let fileURL = documentsDirectoryURL.appendingPathComponent("\(drawing.name)\(getScaleString()).gif")
let destination = CGImageDestinationCreateWithURL(fileURL as CFURL, kUTTypeGIF, kFrameCount, nil)!
CGImageDestinationSetProperties(destination, fileProperties as CFDictionary);
for smdLayer in drawingToUse!.layers{
if !smdLayer.hidden{
let image = UIImage(smdLayer: smdLayer, alphaBlend: useAlphaLayers, backgroundColor: backgroundColorButton.backgroundColor!, scale: scale)
CGImageDestinationAddImage(destination, image.cgImage!, frameProperties as CFDictionary)
}
}
if (!CGImageDestinationFinalize(destination)) {
print("failed to finalize image destination")
}
}
Я поставил точку прерывания прямо перед тем, как позвонить CGImageDestinationAddImage(destination, image.cgImage!, frameProperties as CFDictionary)
, и изображение прекрасно сочетается с правильными цветами. Я надеюсь, что кто-то там знает, чего мне не хватает.
Обновление
Вот пример проекта. Обратите внимание, что, хотя он не анимирован в предварительном просмотре, он сохраняет анимированный gif, и я выхожу из местоположения изображения в консоли.