プレビューなので、まだ利用できないメソッドやバグがたくさんあります。現段階では、この記事は未来のアプリのための検証記事です。記述内容や実装方法も今後変更になる可能性があります。記事自体も未完成となるので、随時更新していく予定です。様々な変更が予想されるので、正式リリースまでは日本語のみとなります。Pからは、BitmapFactoryの代わりに、ImageDecoderを利用してBitmapの生成や操作をおこないます。以降は、これまで利用していたBitmapFactoryはサポート終了になります。BitmapオブジェクトやDrawableオブジェクトを生成できます。画像サイズの変換やcropも可能です。Pを利用するには、{project_folder}/app/build.gradleを下記のコードのように変更します。}}compileSdkVersionを"android-P"、targetSdkVersionを"P"に変更します。ビルドしてコンパイルエラーが発生しなければ準備完了です。端末のギャラリーで選択した画像を、Bitmapに変換して画面に表示します。Bitmap画像表示BitmapFactoryを使う実装ImageDecoderを使った実装をする前に、BitmapFactoryの実装方法をおさらいしておきます。BitmapFactoryを使ったUriからBitmapへの変換処理は、以下の実装手順となります。及び、慣れないうちはOutOfMemoryが多発する難易度の高い実装になります。PからはImageDecoderでUriからBitmapへの変換処理をおこないます。ImageDecoderは、BitmapFactoryの反省から作成されたからか、非常にシンプルな実装が可能です。言語はJavaを使います。data.getData());}コードがたった1行になりました。ImageDecoder.createSourceImageDecoder.createSourceメソッドでImageDecoder.Sourceオブジェクトを生成します。data.getData())createSourceメソッドの引数には、ContentResolverと画像のUriを渡します。ImageDecoder.decodeBitmapImageDecoder.decodeBitmapメソッドは、ImageDecoder.SourceオブジェクトをBitmapに変換します。data.getData()));decodeBitmapメソッドの引数には、ImageDecoder.Sourceオブジェクトを渡します。decodeBitmapメソッドもcreateSourceメソッドと同様、staticメソッドです。ImageDecoderクラスはインスタンスを生成(new)できないことに注意しましょう。上記のコードを実行します。ImageDecoder実行Bitmapの生成に成功しました。画像情報取得ImageDecoderは他にも便利なメソッドが用意されています。画像情報を取得してみましょう。取得可能な画像情報は、画像のサイズ、種類、アニメーション実行の有無です。実装方法は、ImageDecoder.OnHeaderDecodedListenerインターフェースを使ってcallbackで画像情報を受け取ります。msg.append("ImageDecoderでbitmapに変換しました。selectedImageInfo.setText("BitmapFactoryでbitmapに変換しました。ImageDecoder.OnHeaderDecodedListenerImageDecoder.OnHeaderDecodedListenerインターフェースをdecodeBitmapメソッドの引数に渡します。{});ImageDecoder.OnHeaderDecodedListenerインターフェースはonHeaderDecodedメソッドを宣言しています。無名クラスでonHeaderDecodedメソッドを実装します。msg.append("ImageDecoderでbitmapに変換しました。上記のコードを実行します。imageInfo画像情報を取得できているのが確認できました。画像サイズ変更ImageDecoderは画像サイズの変更も可能です。BitmapFactoryのようにOptionsで色々実装する必要はありません。画像サイズの変更は、画像情報取得と同じように、ImageDecoder.OnHeaderDecodedListenerインターフェースを使ってcallbackでImageDecoderオブジェクトを受け取ります。msg.append("ImageDecoderでbitmapに変換しました。selectedImageInfo.setText("BitmapFactoryでbitmapに変換しました。imageDecoder.setResizeImageDecoder#setResizeで画像サイズを変更します。2);setResizeメソッドに画像のwidthとheightを設定します。上記は、ImageDecoder.ImageInfoで取得したwidthとheightのサイズを2倍にして設定しています。上記のコードを実行します。setResize画像を拡大して表示しているのが確認できました。画像が拡大していてもImageInfoの情報が上書きされていない点も頭に入れておきましょう。画像CropImageDecoderは画像cropも可能です。画像cropとは、画像の切り取りです。画像情報取得や画像サイズの変更と同じように、ImageDecoder.OnHeaderDecodedListenerインターフェースを使ってcallbackでImageDecoderオブジェクトを受け取ります。msg.append("ImageDecoderでbitmapに変換しました。selectedImageInfo.setText("BitmapFactoryでbitmapに変換しました。imageDecoder.setCropImageDecoder#setCropで画像をcropします。引数にはRectオブジェクトを渡します。2));Rectクラスは座標位置を設定できます。setCropメソッドは、Rectクラスで設定した範囲をcropします。Rectのleftとtopが画像の左辺と上辺の位置です。0が左辺と上辺ピッタリの位置になります。rightとbottomはleftとtopからの距離になります。上記は、bottomを高さの半分にしています。画像の上半分をcropして表示します。上記のコードを実行します。setCrop画像をcropして表示しているのが確認できました。setResizeメソッドとsetCropメソッドは同じオブジェクトで操作しているので、どちらのメソッドも影響を受けます。一方で、ImageInfoの情報は上書きされないので、整合性に問題がある気がします。結論これまで画像処理は、外部ライブラリの使用が多かったのですが、今後は純正クラスの実装も考慮に入ってきそうです。ImageDecoderは、正式に使えるようになるのが待ち遠しいクラスです。library化に期待です。