2017-09-24 27 views
10

Gần đây, tôi đã gặp sự cố khi tạo Gif nếu thiếu màu quá lớn. Tuy nhiên nhờ sự giúp đỡ của SO, ai đó đã có thể giúp tôi tìm một công việc xung quanh và tạo ra bản đồ màu của riêng tôi.Tạo Bản đồ Màu Hình ảnh Gif trong iOS 11

Câu hỏi trước đây ... iOS Colors Incorrect When Saving Animated Gif

này làm việc rất lớn lên cho đến khi iOS 11. Tôi không thể tìm thấy bất cứ điều gì trong tài liệu mà thay đổi và sẽ làm cho không còn hoạt động này. Những gì tôi đã tìm thấy là nếu tôi loại bỏ kCGImagePropertyGIFImageColorMap Một gif được tạo ra nhưng nó có vấn đề ban đầu, nơi màu sắc bị mất nếu gif được lớn như câu hỏi trước đây của tôi. Điều này có ý nghĩa vì điều này đã được thêm vào để khắc phục sự cố đó.

nghi ngờ Issue ...

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

Dưới đây là một liên kết để tải về một dự án thử nghiệm. Lưu ý nếu bạn chạy nó trên một mô phỏng 10.3 nó hoạt động tuyệt vời nhưng nếu bạn chạy nó trên iOS 11 nó là một hình ảnh màu trắng.

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

mã khác được tham chiếu ...

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

Trả lời

0

Đây là một lỗi trong iOS 11.0 và 11.1. Apple đã sửa lỗi này trong iOS 11.2+

-6

tôi thấy dự án zip. nó không có vẻ "Swifty" .. :)

Dù sao:

  • dưới Bạn có thể tìm mã tối thiểu mà làm việc cho iOS 11.
  • chúng ta có thể bắt đầu từ này

  • câu hỏi sau:

    1) điều gì sẽ xảy ra với các kích thước khác nhau? chúng tôi sử dụng thay đổi kích thước GIF để tạo vùng màu đen xung quanh hình ảnh gốc trong một hình ảnh lớn mới

    2) bạn có thể cho tôi biết thêm chi tiết về bản đồ màu không?

    3) tất cả nội dung với ma trận là gì? có vẻ như bạn muốn điền vào màu đen? đây không phải là cách tiếp cận thông minh và nhanh hơn. Tôi sẽ sử dụng các chức năng của Apple để mở rộng/lấp đầy nền.

Tôi có thể giúp bạn khi bạn đã trả lời.

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

Rất tiếc, điều này không hữu ích. Vấn đề là khi tạo gifs lớn hơn, màu sắc sẽ bị mất theo bản gốc của tôi SO câu hỏi được liên kết. Thêm bản đồ màu sẽ khắc phục vấn đề này nhưng nó không còn hoạt động với iOS 11. Câu trả lời này không giải quyết bất kỳ vấn đề nào. Tôi đang tìm kiếm một câu trả lời để khắc phục vấn đề thiếu màu trong iOS 11. –

+0

bây giờ là một chút sạch hơn. Tôi đã không đọc bài gốc, xin lỗi. Vì vậy, mục tiêu chính là thu phóng gif, tôi có đúng không? (cho mỗi 4 nút trong mẫu ...) – ingconti

+0

Mẫu chia tỷ lệ chúng thành không Phóng to.Vấn đề là khi lưu các màu gifs lớn hơn bị thiếu. –

Các vấn đề liên quan