簡體   English   中英

在后台線程中縮放圖像崩潰 - UIGraphicsImageRenderer

[英]Scaling image in background thread crashes - UIGraphicsImageRenderer

private func scale(image ciImage: CIImage?, for scale: CGFloat) -> UIImage {
    guard let ciImage = ciImage else {
        return UIImage()
    }

    let image = UIImage(ciImage: ciImage)
    let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)

    let renderer = UIGraphicsImageRenderer(size: size)

    return renderer.image(actions: { (context) in
        image.draw(in: CGRect(origin: .zero, size: size))
    })
}

我正在使用這種方法來縮放(並在此之前生成)圖像。 這是在后台線程中完成的,然后將結果分派回主線程。 但是,在 image.draw 上——有時十分之一,應用程序會因 EXC_BAD_ACCESS 而崩潰。

我究竟做錯了什么? 我可以在后台這樣做嗎?

謝謝

不要在后台線程中執行任何UI操作。 所有UI更改都必須在主線程中完成

使用調度隊列在主線程中工作。

DispatchQueue.main.async { 
   image.draw(in: CGRect(origin: .zero, size: size))
}

檢查答案以了解為什么我們使用主線程執行UI操作

它看起來像 CoreUI 中處理矢量圖像的錯誤。 我現在遇到類似的問題,代碼如下

let scaledImage = renderer.image { _ in
        self.draw(in: CGRect(origin: .zero, size: scaledImageSize))
}

導致以下錯誤:

查看[_CUIThemeSVGRendition rawData] ,您可以看到以下release聲明: 在此處輸入圖像描述 我找不到相關的retain ,所以我猜是因為 memory 被釋放了兩次,最終導致崩潰。 看起來if(r8 & 0x3c) == 0x10)正在檢查位圖編碼(參見bitmapEncoding ://developer.limneos.net/index.php?ios=15.2.1&framework=CoreUI.framework&header=CUIThemeRendition.h )但我沒有想法里面應該有什么。 也許我們應該向 Apple 提交錯誤報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM