ギャラリーから画像を選んでトリミングする[android]
level0のandroidブログ化を企んでいるhidakaです。夏フェス情報がでてきて楽しみな季節ですね。
今日はギャラリーから画像を選んでトリミングをやってみましょう。
まずはギャラリーを呼び出して画像を選択します。
上のコードでギャラリーアプリが起動して画像を選択する状態になるのでどれか選んでみましょう。
Picasaのアカウントの画像なんかもでてきていい感じですよねギャラリー。
Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_PICK); startActivityForResult(intent, REQUEST_PICK_CONTACT);
次に選ばれた画像を受け取ります。
ギャラリー画面の結果をonActivityResultで受け取ります。
後で使うコードもありますが、REQUEST_PICK_CONTACTのほう。
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_PICK_CONTACT && data != null) { photoUri = data.getData(); StartTrim(getPath(photoUri), photoUri); } if (requestCode == REQUEST_PICK_CONTACT2) { //トリミングした画像ファイルを読み込み。 Bitmap bm = Utils.getFromSD(this, "croptmp.jpg"); } }
選択した画像のIDが取得できるので、ここで画像本体のファイルを取得します。
getPathというのがそこ。MediaStoreから取得します。
public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); }
画像を取得したら、次はトリミング。StartTrimという関数を呼んでいますが、それが以下。
一般的にはギャラリーアプリはcom.android.galleryというパッケージ名ですが、com.cooliris.media
というパッケージ名の場合もあります。(xperiaとか)なのでPackageManagerでまず存在するかの確認。
あったほうを使います。あとは縦横比などを設定。今回は壁紙に使おうと思うのでgetWallpaperDesiredMinimumWidthなどで壁紙サイズを取得して使っています。
private void StartTrim(String url, Uri photoUri) { PackageManager pm = this.getPackageManager(); Listlist = pm.getInstalledApplications(0); apps[0] = "com.android.gallery"; apps[1] = "com.cooliris.media"; String[] clss = new String[2]; clss[0] = "com.android.camera.CropImage"; clss[1] = "com.cooliris.media.CropImage"; int classtype = -1; for (ApplicationInfo ai : list) { String s1 = ai.packageName; if (apps[0].equals(s1)) { classtype = 0; } if (apps[1].equals(s1)) { classtype = 1; } } Intent intent = new Intent(); if (classtype >= 0) { intent.setClassName(apps[classtype], clss[classtype]); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 4); intent.putExtra("aspectY", 3); intent.putExtra("outputX", getWallpaperDesiredMinimumWidth()); intent.putExtra("outputY", getWallpaperDesiredMinimumHeight()); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); intent.putExtra("output", Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"croptmp.jpg"))); intent.setData(photoUri); startActivityForResult(intent, REQUEST_PICK_CONTACT2); } else { NoCropMode(); } }
これで結果をonActivityResultで受け取ります。
今度はREQUEST_PICK_CONTACT2のほう。