Android
画像

android.media.Imageとはなにか

公式ドキュメント

Image | Android Developers

使われどころ

Cameraを使った処理(android.hardware.camera2とか)で画像を取得するとこの形式で取得される。

https://github.com/googlesamples/android-Camera2Basic より

1) Image取得できたときのイベントリスナ

private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
    backgroundHandler?.post(ImageSaver(it.acquireNextImage(), file))
}
  • it.acquireNextImage()でandroid.media.Imageが取得される。
  • onImageAvailableは新しいImageをImageReaderで読み取れるようになったときのイベント

2) 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数

3) 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がいくつかあってそれらがそれぞれどのような意味かは、画像形式によって異なる。