2017-09-24 25 views
10

Gifを作成するときに最近、問題が発生していました。しかしSOの助けを借りれば、誰かが私の仕事を見つけて自分のカラーマップを作成するのを手助けすることができました。これは私が変更され、ドキュメントに何かを見つけることができないと、このもはや仕事になるだろうiOSの11まで素晴らしい仕事iOS Colors Incorrect When Saving Animated GifiOS 11でGIF画像カラーマップを作成する

ここに前の問題...。 kCGImagePropertyGIFImageColorMap gifが生成されていますが、以前の問題のようにgif​​が大きくなった場合に色が欠落するというオリジナルの問題があります。これは、この問題を解決するために追加されたので意味があります。ここで

疑い号...

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

は、テストプロジェクトをダウンロードするためのリンクです。 10.3シミュレータで実行するとうまくいきますが、iOS 11で実行すると白い画像になります。

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

参照されているその他のコード...

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

答えて

0

これはiOSの11.0と11.1のバグです。 AppleはiOS 11.2以降でこれを解決しました

-6

私はジッププロジェクトを見ました。あなた以下

  • 我々はこの

  • 質問から始めることができますiOSの11

  • のために働く最小限のコードを見つけることができます: "swifty" .. :)とにかく

    はないようですです。

    1)サイズが異なるとどうなりますか?私たちは新しい大きな画像の元の画像の周りに黒い領域を作るGIFのサイズを変更する

    2)あなたは私にカラーマップの詳細を教えてもらえますか?

    3)マトリックスとは何ですか?あなたは黒を塗りたいと思う?これはスマートで迅速なアプローチではありません。アップルの機能を使って背景を拡大/縮小します。

私はあなたに一度お世話になります。

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

残念ながら、これは役に立ちません。問題は、より大きなGIFを作成するときに私のオリジナルのSOの質問にリンクされている色が行方不明になることです。カラーマップを追加するとこの問題は修正されますが、iOS 11では機能しなくなりました。私はiOS 11の色の欠如の問題を解決するための答えを探しています。 –

+0

は今や少しきれいです。私は元の投稿を読んでいない、申し訳ありません。 メインターゲットはGIFをズームすることです。そうですか? (サンプル中の4つのボタンにつき...) – ingconti

+0

サンプルはそれらを拡大しないで拡大します。問題は、大きなGIFの色を保存していない場合です。 –

関連する問題