Почему приложение завершается из-за потери памяти при конвертации pdf-страницы в высококачественное изображение в ios, быстрое в реальном устройстве - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь получить изображение (высокое качество) каждой страницы PDF. Я использую приведенный ниже код, проходящий через цикл for до количества страниц, и он работает.

    guard let document = CGPDFDocument(pdfurl as CFURL) else { return }
    guard let page = document.page(at: i) else { return }
    let dpi: CGFloat = 300.0/72.0
    let pagerect = page.getBoxRect(.mediaBox)
    print(pagebounds)
    print(pagerect)
    let render = UIGraphicsImageRenderer(size: CGSize(width: pagerect.size.width * dpi, height: pagerect.size.height * dpi))

    let imagedata = render.jpegData(withCompressionQuality: 0.5, actions: { cnv in
        UIColor.white.set()
        cnv.fill(pagerect)
        cnv.cgContext.translateBy(x: 0.0, y: pagerect.size.height * dpi)
        cnv.cgContext.scaleBy(x: dpi, y: -dpi)
        cnv.cgContext.drawPDFPage(page)
    })
    let image = UIImage(data: imagedata)

У меня возникают следующие проблемы с этим ...

  • иногда image равен nil.
  • Когда это выполняется, использование memory is very high.
  • При подсчете страниц (количестве страниц) использование памяти очень и очень велико, иногда оно достигает значения 1.4 GB, и приложение неожиданно вылетает с предупреждением: Terminate due to memory waring. затем я попытался запустить код выше autoreleasepool. это сработало, но когда использование памяти более высокое (когда оно близко к объему оперативной памяти), приложение снова вылетает с предупреждением выше.

Как я могу избежать этого предупреждения памяти и получить качественное изображение на странице PDF. надеюсь любая помощь. хорошего дня.

1 Ответ

0 голосов
/ 10 мая 2019

1) иногда изображение ноль.

  • Есть ли причина, по которой вы генерируете данные в формате jpeg, а затем преобразуете в UIImage VS, непосредственно создавая uiimage (используя func image(actions: (UIGraphicsImageRendererContext) -> Void) -> UIImage)?
  • Если вам действительно нужно использовать метод jpeg, не создавайте экземпляры напрямую из UIImage(data:), используйте CGImage's init?(jpegDataProviderSource source: CGDataProvider, decode: UnsafePointer<CGFloat>?, shouldInterpolate: Bool, intent: CGColorRenderingIntent), затем используйте UIImage(cgImage:), чтобы получить UIImage экземпляр

2) При этом использование памяти очень велико

  • Сохраняете ли вы все изображения, созданные для каждой страницы? Если да, то если у вас есть pdf с большим количеством страниц, то в какой-то момент вы будете использовать максимум памяти из-за накопленных изображений. Почему бы вам не сохранить на диске каждое созданное изображение, а затем выпустить его, чтобы не накапливать память для хранения всех страниц в памяти.
  • Совместное использование цикла (при условии, что цикл есть) за пределами этого фрагмента может помочь решить вашу проблему подробнее
...