📘

【kotlin】ImageProxyからBitmapを得るときはByteBufferを利用したほうがメモリ効率が良い

2023/08/11に公開

ImageProxyでBitmapを得る方法は2つある

  • ImageProxyから直接toBitmapを使用する方法
val bitmap = imageProxy.toBitmap()
  • ByteBufferを経由してBitmapFactory.decodeByteArrayを使用する方法
val buffer: ByteBuffer = imageProxy.planes[0].buffer
val bytes = ByteArray(buffer.remaining())
buffer.get(bytes)
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)

toBitmap : 高コスト

比較的メモリにとって高コストな操作が実行されるので、大きな画像や高解像度の画像を扱う場合にはパフォーマンスに影響を及ぼす可能性がある

    1. 内部でBitmapオブジェクトを作成し、
    1. 画像データをそのオブジェクトにコピー
  • 中間バイト配列が生成される

ByteBufferを経由してBitmapFactory.decodeByteArray : 効率が良い

  • 直接メモリアクセスが可能
  • したがって、中間バイトデータではなく元のバイトデータからBitmapを作成することになる

一般的にはより効率的で、特に大きな画像や高解像度の画像を扱う場合にはパフォーマンスの向上が期待できる

ただし、画像データが正しい形式である(つまり、BitmapFactory.decodeByteArrayが解釈できる形式である)ことを前提とする

これは必ずしも保証されるものではない(ネットワーク画像を扱う場合など)

Discussion