UIGraphicsImageRendererで画像を描画するときに、なぜ大量のメモリを使用するのですか?

ジェイク・トゥ

写真の品質を維持しながら、写真に白い境界線を追加したいので、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]

編集
0

コメントを追加

0

関連記事

分類Dev

UIGraphicsImageRendererで画像を描画するときに、なぜ大量のメモリを使用するのですか?

分類Dev

read.csv()を使用するときにRが大量のメモリを使用するのはなぜですか?

分類Dev

Pythonの「shelve」を「dict」に変換するとメモリが大量に使用されるのはなぜですか?

分類Dev

大量のメモリを使用するとLinuxが応答しなくなるのはなぜですか(OOMをトリガーできません)

分類Dev

DockerがVIRTメモリを大量に消費するのはなぜですか?

分類Dev

C ++の配列と比較して、クラスが大量のメモリを使用するのはなぜですか

分類Dev

なぜSymfonyResponseの構築に時間がかかり、メモリを大量に使用するのですか?それに対して何ができますか?

分類Dev

UIImageが大量のメモリを消費するのはなぜですか?

分類Dev

大きなJava配列を作成すると、メモリが大量に消費されるのはなぜですか?

分類Dev

Reactアプリが大量のメモリを使用するのはなぜですか?

分類Dev

なぜGNUはそのようなメモリを大量に消費するのですか?

分類Dev

カスタムスタッククラスが大量のメモリを使用するのはなぜですか?

分類Dev

このJavaプログラムがメモリを大量に消費するのはなぜですか?

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

分類Dev

このコードが大量のメモリを使用しているのはなぜですか?

分類Dev

プログラムが大量のメモリを使用して実行されるのはなぜですか?

分類Dev

ブラウザが大量のメモリを使用しているのはなぜですか?

分類Dev

OSがRAMを大量に使用するのはなぜですか?

分類Dev

静的から同じことを達成できるのに、なぜ動的メモリ割り当てを使用する必要があるのですか?

分類Dev

s3からのread_csvをdaskが大量のメモリを保持するのはなぜですか?

分類Dev

Haskellの「何もしない」関数idが大量のメモリを消費するのはなぜですか?

分類Dev

グレースケール画像に描画するときにOpenCVがアンチエイリアスを適用しないのはなぜですか?

分類Dev

配列+ =(@なし)が大量のメモリ割り当てを生成するのはなぜですか?

分類Dev

大量のメモリを使用せずにJavaで大きなデータセットを処理する方法

Related 関連記事

  1. 1

    UIGraphicsImageRendererで画像を描画するときに、なぜ大量のメモリを使用するのですか?

  2. 2

    read.csv()を使用するときにRが大量のメモリを使用するのはなぜですか?

  3. 3

    Pythonの「shelve」を「dict」に変換するとメモリが大量に使用されるのはなぜですか?

  4. 4

    大量のメモリを使用するとLinuxが応答しなくなるのはなぜですか(OOMをトリガーできません)

  5. 5

    DockerがVIRTメモリを大量に消費するのはなぜですか?

  6. 6

    C ++の配列と比較して、クラスが大量のメモリを使用するのはなぜですか

  7. 7

    なぜSymfonyResponseの構築に時間がかかり、メモリを大量に使用するのですか?それに対して何ができますか?

  8. 8

    UIImageが大量のメモリを消費するのはなぜですか?

  9. 9

    大きなJava配列を作成すると、メモリが大量に消費されるのはなぜですか?

  10. 10

    Reactアプリが大量のメモリを使用するのはなぜですか?

  11. 11

    なぜGNUはそのようなメモリを大量に消費するのですか?

  12. 12

    カスタムスタッククラスが大量のメモリを使用するのはなぜですか?

  13. 13

    このJavaプログラムがメモリを大量に消費するのはなぜですか?

  14. 14

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  15. 15

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  16. 16

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  17. 17

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  18. 18

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  19. 19

    PHPがクエリ結果を保存するために大量のメモリを使用するのはなぜですか

  20. 20

    このコードが大量のメモリを使用しているのはなぜですか?

  21. 21

    プログラムが大量のメモリを使用して実行されるのはなぜですか?

  22. 22

    ブラウザが大量のメモリを使用しているのはなぜですか?

  23. 23

    OSがRAMを大量に使用するのはなぜですか?

  24. 24

    静的から同じことを達成できるのに、なぜ動的メモリ割り当てを使用する必要があるのですか?

  25. 25

    s3からのread_csvをdaskが大量のメモリを保持するのはなぜですか?

  26. 26

    Haskellの「何もしない」関数idが大量のメモリを消費するのはなぜですか?

  27. 27

    グレースケール画像に描画するときにOpenCVがアンチエイリアスを適用しないのはなぜですか?

  28. 28

    配列+ =(@なし)が大量のメモリ割り当てを生成するのはなぜですか?

  29. 29

    大量のメモリを使用せずにJavaで大きなデータセットを処理する方法

ホットタグ

アーカイブ