がぶちゃんの日記

札幌からフルリモートCTO

インテントでAndroid標準のトリミング機能(アプリ)を呼び出す方法

プロフィール写真やアイコン画像の設定画面なんかでよくある「写真を選んで→トリミングして」ってやつです。
あんまり日本語の情報がなかったので書きます。

ギャラリーを呼び出して写真を選ぶ

public void onChangePhotoClick(View view) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, REQUEST_GET_CONTENT);
}

トリミング機能(アプリ)を呼び出す

写真が選ばれたらonActivityResult()が呼び出されるので、選ばれた写真のUriを使ってトリミング機能(アプリ)を呼び出します。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case REQUEST_GET_CONTENT:
        if (resultCode != RESULT_OK) return;
        Uri uri = data.getData(); // 選ばれた写真のUri
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setData(uri);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, REQUEST_CROP_PICK);
        break;
    }
}

感の良い人はExtraのキー名でだいたい意味がわかると思いますが、各キーの意味は以下の通りです。

outputX
トリミング後の画像の幅(px)
outputY
トリミング後の画像の高さ(px)
aspectX
トリミング後の画像のアスペクト比(X)
aspectY
トリミング後の画像のアスペクト比(Y)
scale
トリミング中の枠を拡大縮小できるかどうか
return-data
基本的にtrue

トリミングされた画像を取得する

トリミングされた画像もonActivityResult()で受け取ります。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case REQUEST_GET_CONTENT:
        // 省略
    case REQUEST_CROP_PICK:
        if (resultCode != RESULT_OK) return;
        Bitmap bitmap = data.getExtras().getParcelable("data");
        // 取得したBitmapでごにょごにょする
    }
}

以上です!
レシピ105に入れたい。。。