写真の品質を維持しながら、写真に白い境界線を追加したいので、UIGraphicsImageRendererを使用して白い背景を描画し、次に写真を描画します。その結果、メモリ使用量が劇的に増加します。仕方?
元の画像の解像度は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))
}
使用されるメモリを検討するときは、JPGまたはPNGファイルのサイズに惑わされないでください。これは、通常、圧縮されているためです。メモリで画像操作を実行する場合は、ピクセルあたり4バイトが必要になります(たとえば、幅×高さ×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のみです。それでもまだ大量のメモリですが、デフォルトのスケール(網膜デバイス)を使用する場合よりもはるかに少なくなります。または、改訂した4,032×3,024の画像を考慮すると、この1×画像は49 MBしか取れず、スケールを設定しなかった対応する3×画像の1/9のサイズになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加