2017-09-24 1 views
10

Ich hatte vor kurzem ein Problem beim Erstellen eines Gif, wo, wenn es zu groß wurde, Farben fehlten. Dank der Hilfe von SO konnte mir jemand helfen, eine Arbeit zu finden und meine eigene Farbkarte zu erstellen.Erstellen von Gif Image Color Maps in iOS 11

Vorhergehende Frage hier ... iOS Colors Incorrect When Saving Animated Gif

Das bis iOS große aufgearbeitet 11. Ich kann nichts in der Dokumentation finden, die geändert und kann dieses nicht mehr funktioniert. Was ich gefunden habe ist, wenn ich entferne kCGImagePropertyGIFImageColorMap Ein GIF wird generiert, aber es hat das ursprüngliche Problem, wo Farben fehlen, wenn das GIF zu groß wie meine vorherige Frage wird. Dies ist sinnvoll, da dies hinzugefügt wurde, um dieses Problem zu beheben.

Mutmaßliche Ausgabe ...

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: "")! 
} 

Hier ist ein Link ein Testprojekt zum Download bereit. Beachten Sie, wenn Sie es auf einem 10.3-Simulator ausführen, funktioniert es großartig, aber wenn Sie es auf iOS 11 ausführen, ist es ein weißes Bild.

https://www.dropbox.com/s/hdmkwyz47ondd52/gifTest2.zip?dl=0

Andere Code, auf die verwiesen wird ...

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

Antwort

0

Dies ist ein Fehler in iOS 11.0 und 11.1. Apple hat das in iOS 11.2+ behoben

-6

sah ich zip-Projekt. es scheint .. :) nicht "swifty"

Wie dem auch sei:

  • unten Sie minimal Code finden können, die 11.
  • für iOS funktioniert können wir aus dieser

  • Fragen beginnen:

    1) Was sollte für verschiedene Größen passieren? wir muse Größe ändern GIF von machen Sie einen schwarzen Bereich um Originalbild in einem neuen großen Bild

    2) können Sie mir mehr Details über Farbkarten geben?

    3) Was ist alles mit Matrizen? es scheint, dass Sie schwarz ausfüllen möchten? Das ist nicht der schlaue und schnellere Ansatz. Ich werde Apple-Funktionen verwenden, um den Hintergrund zu vergrößern/zu füllen.

Ich kann Ihnen helfen, sobald Sie freundlich beantwortet haben.

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

Leider ist das nicht hilfreich. Das Problem ist, wenn größere Gifs erstellt werden, gehen die Farben nach meinen Originalen verloren. Das Hinzufügen von Farbzuordnungen behebt dieses Problem, funktioniert jedoch nicht mehr mit iOS 11. Diese Antwort wird nicht behandelt. Ich suche nach einer Antwort, um das Problem der fehlenden Farben in iOS 11 zu beheben. –

+0

ist jetzt ein bisschen sauberer. Ich habe den ursprünglichen Beitrag nicht gelesen, tut mir leid. Also das Hauptziel ist es, Gifs zu zoomen, habe ich recht? (eine pro 4 Tasten in Probe ...) – ingconti

+0

Die Probe skaliert sie nicht Zooms.Das Problem ist, wenn beim Speichern von größeren Gifs Farben fehlen. –