J'ai récemment rencontré un problème lors de la création d'un fichier GIF, et si des couleurs trop grandes étaient manquantes. Cependant, grâce à l'aide de SO, quelqu'un a pu m'aider à trouver un travail et à créer ma propre carte en couleur.Création de cartes de couleurs d'images Gif dans iOS 11
Question précédente ici ... iOS Colors Incorrect When Saving Animated Gif
Cela a très bien fonctionné jusqu'à iOS 11. Je ne trouve rien dans les documents qui ont changé et rendrait ce ne fonctionnent plus. Ce que j'ai trouvé, c'est si j'enlève kCGImagePropertyGIFImageColorMap
Un gif est généré mais il a le problème d'origine où les couleurs disparaissent si le gif devient trop grand comme ma précédente question. Cela a du sens car cela a été ajouté pour résoudre ce problème.
Soupçonné numéro ...
func createGifFromImage(_ image: UIImage) -> URL{
let fileProperties: [CFString: CFDictionary] = [kCGImagePropertyGIFDictionary: [
kCGImagePropertyGIFHasGlobalColorMap: false as NSNumber] as CFDictionary]
let documentsDirectoryPath = "file://\(NSTemporaryDirectory())"
if let documentsDirectoryURL = URL(string: documentsDirectoryPath){
let fileURL = documentsDirectoryURL.appendingPathComponent("test.gif")
let destination = CGImageDestinationCreateWithURL(fileURL as CFURL, kUTTypeGIF, 1, nil)!
CGImageDestinationSetProperties(destination, fileProperties as CFDictionary);
let colorMap = image.getColorMap()
print("ColorMap \(colorMap.exported as NSData)")
let frameProperties: [String: AnyObject] = [
String(kCGImagePropertyGIFImageColorMap): colorMap.exported as NSData
]
let properties: [String: AnyObject] = [
String(kCGImagePropertyGIFDictionary): frameProperties as AnyObject
]
CGImageDestinationAddImage(destination, image.cgImage!, properties as CFDictionary);
if (!CGImageDestinationFinalize(destination)) {
print("failed to finalize image destination")
}
return fileURL
}
//shouldn't get here
return URL(string: "")!
}
Voici un lien pour télécharger un projet de test. Notez que si vous l'utilisez sur un simulateur 10.3, cela fonctionne très bien mais si vous l'exécutez sur iOS 11, c'est une image blanche.
https://www.dropbox.com/s/hdmkwyz47ondd52/gifTest2.zip?dl=0
Autre code qui est référencé ...
extension UIImage{
//MARK: - Pixel
func getColorMap() -> ColorMap {
var colorMap = ColorMap()
let pixelData = self.cgImage!.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var byteIndex = 0
for _ in 0 ..< Int(size.height){
for _ in 0 ..< Int(size.width){
let color = Color(red: data[byteIndex], green: data[byteIndex + 1], blue: data[byteIndex + 2])
colorMap.colors.insert(color)
byteIndex += 4
}
}
return colorMap
}
}
ColorMap
struct Color : Hashable {
let red: UInt8
let green: UInt8
let blue: UInt8
var hashValue: Int {
return Int(red) + Int(green) + Int(blue)
}
public static func == (lhs: Color, rhs: Color) -> Bool {
return [lhs.red, lhs.green, lhs.blue] == [rhs.red, rhs.green, rhs.blue]
}
}
struct ColorMap {
var colors = Set<Color>()
var exported: Data {
let data = Array(colors)
.map { [$0.red, $0.green, $0.blue] }
.joined()
return Data(bytes: Array(data))
}
}
Malheureusement, ce n'est pas utile. Le problème est lors de la création de plus gros gifs les couleurs disparaissent selon mes originaux SO question liée. L'ajout de cartes de couleurs résout ce problème, mais ne fonctionne plus avec iOS 11. Cette réponse ne répond à aucun de ces problèmes. Je cherche une réponse pour résoudre le problème des couleurs manquantes dans iOS 11. –
est maintenant un peu plus propre. Je n'ai pas lu le message original, désolé. Donc, l'objectif principal est de zoomer les gifs, ai-je raison? (un pour 4 boutons dans l'échantillon ...) – ingconti
L'échantillon les agrandit non Zooms.Le problème est lorsque vous enregistrez des couleurs GIF plus grandes disparaissent. –