2017-09-24 18 views
10

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)) 
    } 
} 

Répondre

0

Ce bogue dans iOS 11.0 et 11.1. Apple a corrigé ce problème dans iOS 11.2+

-6

j'ai vu projet zip. il est ne semble pas "Swifty" .. :)

Quoi qu'il en soit:

  • Vous trouverez un minimum de code qui fonctionne pour iOS 11.
  • nous pouvons commencer à partir de ce

  • questions:

    1) que devrait-il se passer pour différentes tailles? nous avons pensé à redimensionner GIF de faire une zone noire autour de l'image originale dans une nouvelle grande image

    2) Pouvez-vous me donner plus de détails sur les cartes en couleur?

    3) à quoi servent toutes les matrices? il semble que vous voulez remplir en noir? Ce n'est pas l'approche intelligente et plus rapide. J'utiliserai les fonctions d'Apple pour agrandir/remplir l'arrière-plan.

Je peux vous aider une fois que vous avez aimablement répondu.

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    if let image = UIImage(named: "image1"){ 
     createGIFFrom(image: image) 
    } 
} 

final func localPath()->URL{ 
    let tempPath = NSTemporaryDirectory() 
    let url = URL.init(fileURLWithPath: tempPath) 
    return url.appendingPathComponent("test.gif") 
} 


private final func createGIFFrom(image: UIImage){ 
    let fileURL = self.localPath() 
    let type: CFString = kUTTypeGIF// kUTTypePNG 
    // from apple code: 
    //https://developer.apple.com/library/content/technotes/tn2313/_index.html 

    guard let myImageDest = CGImageDestinationCreateWithURL(fileURL as CFURL, type, 1, nil) else{ 
     return 
    } 

    guard let imageRef = image.cgImage else{ 
     return 
    } 

    // Add an image to the image destination 
    CGImageDestinationAddImage(myImageDest, imageRef, nil) 
    CGImageDestinationFinalize(myImageDest) 

    print("open image at: \(fileURL)") 

} 

}

+2

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. –

+0

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

+0

L'échantillon les agrandit non Zooms.Le problème est lorsque vous enregistrez des couleurs GIF plus grandes disparaissent. –