📘
【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