簡體   English   中英

為什么用 UIGraphicsImageRenderer 繪制圖像時大量使用 memory?

[英]Why use a lot of memory when drawing image with UIGraphicsImageRenderer?

我想給照片加一個白色邊框,同時保持照片的質量,所以我用UIGraphicsImageRenderer畫了一個白色的背景,然后把照片畫上去,結果memory的使用量急劇增加,有沒有更好的方法?

原圖分辨率為4032*3024。

let renderer = UIGraphicsImageRenderer(size: CGSize(width: canvasSideLength, height: canvasSideLength))
let newImage = renderer.image { context in
    UIColor.white.setFill()
    context.fill(CGRect(x: 0, y: 0, width: canvasSideLength, height: canvasSideLength))
    image.draw(in: CGRect(x: photoCanvasX, y: photoCanvasY, width: photoCanvasWidth, height: photoCanvasHeight))
}

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

在考慮使用的 memory 時,不要被 JPG 或 PNG 文件的大小誤導,因為它們通常是壓縮的。 在 memory 中執行圖像操作時,每個像素需要四個字節(例如,寬 × 高 × 4,以像素為單位)。

更糟糕的是,默認情況下, UIGraphicsImageRenderer將生成屏幕分辨率的圖像(例如,可能為 2 倍或 3 倍,具體取決於您的設備)。 例如,在 3× 設備上,考慮:

let rect = CGRect(origin: .zero, size: CGSize(width: 8_519, height: 8_519))
let image = UIGraphicsImageRenderer(bounds: rect).image { _ in
    UIColor.white.setFill()
    UIBezierPath(rect: rect).fill()
}
print(image.cgImage!.width, "×", image.cgImage!.height)

那將打印:

25557 × 25557

當您考慮到每個像素需要 4 個字節時,加起來就是 2.6gb。 即使圖像只有 4,032 × 3,024,正如您修改后的問題所建議的那樣,每張圖像仍然是 439mb。

您可能需要確保指定明確的比例 1:

let rect = CGRect(origin: .zero, size: CGSize(width: 8_519, height: 8_519))
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let image = UIGraphicsImageRenderer(bounds: rect, format: format).image { _ in
    UIColor.white.setFill()
    UIBezierPath(rect: rect).fill()
}
print(image.cgImage!.width, "×", image.cgImage!.height)

如您所料,這將打印:

8519 × 8519

然后你只需要 290mb 的圖像。 這仍然是很多 memory,但比使用默認比例(在視網膜設備上)要少得多。 或者,考慮到您修改后的 4,032 × 3,024 圖像,這個 1× 圖像可能只需要 49mb,是您未設置比例的相應 3× 圖像大小的 1/9。

暫無
暫無

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

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