公式ドキュメント
使われどころ
Cameraを使った処理(android.hardware.camera2とか)で画像を取得するとこの形式で取得される。
https://github.com/googlesamples/android-Camera2Basic より
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
backgroundHandler?.post(ImageSaver(it.acquireNextImage(), file))
}
-
it.acquireNextImage()
でandroid.media.Imageが取得される。 - onImageAvailableは新しいImageをImageReaderで読み取れるようになったときのイベント
imageReader = ImageReader.newInstance(largest.width, largest.height,
ImageFormat.JPEG, /*maxImages*/ 2).apply {
setOnImageAvailableListener(onImageAvailableListener, backgroundHandler)
-
ImageReader.newInstance()
で上のイベントリスナを渡している。 -
ImageReader.newInstanceの初期化では以下をわたす。
- int width -> ImageReaderが生成するImageの幅(ピクセル数)
- int height -> ImageReaderが生成するImageの高さ(ピクセル数)
- int format -> ImageReaderが生成するImageのフォーマット(ImageFormat, PixelFormat を指定する)
- maxImages -> アクセスできるようにするImage数
val buffer = image.planes[0].buffer
val bytes = ByteArray(buffer.remaining())
buffer.get(bytes)
var output: FileOutputStream? = null
try {
output = FileOutputStream(file).apply {
write(bytes)
}
} catch (e: IOException) {
Log.e(TAG, e.toString())
} finally {
image.close()
output?.let {
try {
it.close()
} catch (e: IOException) {
Log.e(TAG, e.toString())
}
}
}
-
Image.planes[0]
をファイルに保存している。
android.media.Imageとは
- 生成された画像のPixelの情報をBiteBufferとして直接アクセスできるようにするクラス。
- Image自体はメタ情報(高さ、幅など)を取得できるメソッドと、画像の破棄のための
close()
を持っている。 - 実際の画像情報を取得するときは、ImageからImage.Planeを参照する。
android.media.Image.Planeとは
- 画像データ自体のバイト列にアクセスするためのクラス
- ImageからPlaneの配列が取得できる。
- Planeがいくつかあってそれらがそれぞれどのような意味かは、画像形式によって異なる。