Как исправить проблему с памятью при обработке изображений? - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю gif-сплиттер, который возвращает последовательность изображений из данного gif-файла, он хорошо работает с маленькими гифками и все выглядит так, как нужно, но с большими файлами (больше 500 × 500 px), что вызывает проблемы с памятью.

Сообщение Xcode: Сообщение от отладчика: прекращено из-за проблемы с памятью «Соединение прервано» Ошибка связи

Больше, чем эта проблема Я не вижу утечек или нагрузки в анализаторе XCode, использование памяти составляет 50 - 110 МБ?!

Я пытался изменить gifOptions, но ничего не изменилось.

import UIKit
import ImageIO
import MobileCoreServices 

class CGifManager { 

  static let shared = CGifManager()

  public func getSequence(gifNamed: String) -> [UIImage]? { 
     guard let bundleURL = Bundle.main .url(forResource: gifNamed, withExtension: "gif") else { 
       print("This image named \"\(gifNamed)\" does not exist!"); return nil 
     } 

     guard let imageData = try? Data(contentsOf: bundleURL) else { 
       print("Cannot turn image named \"\(gifNamed)\" into NSData") return nil 
     } 

     let gifOptions = [ kCGImageSourceShouldAllowFloat as String : true as NSNumber, 
                        kCGImageSourceCreateThumbnailWithTransform as String : true as NSNumber, 
                        kCGImageSourceCreateThumbnailFromImageAlways as String : true as NSNumber 
                       ] as CFDictionary 
     guard let imageSource = CGImageSourceCreateWithData(imageData as CFData, gifOptions) else {
       debugPrint("Cannot create image source with data!"); return nil 
      } 

      let framesCount = CGImageSourceGetCount(imageSource) 
      var frameList = [UIImage]() 
      for index in 0 ..< framesCount { 
         if let cgImageRef = CGImageSourceCreateImageAtIndex(imageSource, index, nil) { 
            let uiImageRef = UIImage(cgImage: cgImageRef) 
            frameList.append(uiImageRef) 
         } 
      } 
      return frameList 
    }
  }

Этот код тестировался с размерами 400 x 400 и 400 x 500 (30 кадров) в формате gif и работал также, но на самом деле мне нужно работать со всеми размерами, поэтому я понятия не имею, в чем проблема?

Любая помощь приемлема.

1 Ответ

2 голосов
/ 10 апреля 2019

Это источник одной из ваших главных проблем:

var frameList = [UIImage]() 

Сигнальные колокола!Хранение массива UIImages в памяти - отличный способ исчерпать память.Сохраняйте изображения, сохраненные на диск, и создавайте массив их имен или URL-адресов.

...