📘
【kotlin】ImageProxyからBitmapを得るときはByteBufferを利用したほうがメモリ効率が良い
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
: 高コスト
比較的メモリにとって高コストな操作が実行されるので、大きな画像や高解像度の画像を扱う場合にはパフォーマンスに影響を及ぼす可能性がある
-
- 内部で
Bitmap
オブジェクトを作成し、
- 内部で
-
- 画像データをそのオブジェクトにコピー
- 中間バイト配列が生成される
ByteBuffer
を経由してBitmapFactory.decodeByteArray
: 効率が良い
- 直接メモリアクセスが可能
- したがって、中間バイトデータではなく元のバイトデータから
Bitmap
を作成することになる
一般的にはより効率的で、特に大きな画像や高解像度の画像を扱う場合にはパフォーマンスの向上が期待できる
ただし、画像データが正しい形式である(つまり、BitmapFactory.decodeByteArray
が解釈できる形式である)ことを前提とする
これは必ずしも保証されるものではない(ネットワーク画像を扱う場合など)
Discussion