質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2653閲覧

android studio ギャラリーから正しい向きの写真を取得したい

xue

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/08/14 06:13

前提・実現したいこと

ギャラリーから正しい向きで写真を取り出したいです.

発生している問題・エラーメッセージ

現在のコードでは,写真を撮ってそのままimageviewに張り付ける場合には上手くいくのですが,
ギャラリーから選択する場合はなぜか上手くいく時といかない時があります.

該当のソースコード

@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if(requestCode == RESULT_CAMERA) { if(resultCode != RESULT_OK) { // キャンセル時 return ; } Uri resultUri = (intent != null ? intent.getData() : m_uri); if(resultUri == null) { // 取得失敗 return; } // ギャラリーへスキャンを促す MediaScannerConnection.scanFile( this, new String[]{resultUri.getPath()}, new String[]{"image/jpeg"}, null ); // 画像を設定 try { bitmapp = MediaStore.Images.Media.getBitmap(this.getContentResolver(),resultUri); } catch (IOException e) { e.printStackTrace(); } // 画像の横、縦サイズを取得 int imageWidth = bitmapp.getWidth(); int imageHeight = bitmapp.getHeight(); int correctDegree1; if(getFilePath(getApplication() , resultUri) != null) { //カメラから correctDegree1 = getRotateDegree(getFilePath(getApplication(), resultUri)); }else{ //ギャラリーから assert intent != null; correctDegree1 = getRotateDegree(getPath2(intent)); } Matrix matrix = new Matrix(); matrix.setRotate(correctDegree1, (float) imageWidth/2, (float) imageHeight/2); Bitmap bitmap3 = Bitmap.createBitmap(bitmapp, 0, 0, imageWidth, imageHeight, matrix, true); imageView.setImageBitmap(bitmap3); } private void showGallery() { //カメラの起動Intentの用意 String photoName = System.currentTimeMillis() + ".jpg"; ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Images.Media.TITLE, photoName); contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); m_uri = getContentResolver() .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, m_uri); // ギャラリー用のIntent作成 Intent intentGallery; intentGallery = new Intent(Intent.ACTION_OPEN_DOCUMENT); intentGallery.addCategory(Intent.CATEGORY_OPENABLE); intentGallery.setType("image/jpeg"); Intent intent = Intent.createChooser(intentCamera, "画像の選択"); intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {intentGallery}); startActivityForResult(intent, RESULT_CAMERA); } //アプリから起動したカメラで撮影した写真のファイルパスを取得 public static String getFilePath(Context context, Uri uri) { ContentResolver contentResolver = context.getContentResolver(); String[] columns = { MediaStore.Images.Media.DATA }; Cursor cursor = contentResolver.query(uri, columns, null, null, null); assert cursor != null; cursor.moveToFirst(); String path = cursor.getString(0); cursor.close(); return path; } //角度を取得 private int getRotateDegree(String filePath) { int degree; try { ExifInterface exifInterface = new ExifInterface(filePath); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { degree = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { degree = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { degree = 270; }else{ degree = 0; } if (degree != 0) { exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "0"); exifInterface.saveAttributes(); } } catch (IOException e) { degree = -1; e.printStackTrace(); } return degree; } //ギャラリーからファイルパスを取得 private String getPath2(Intent intent){ String strDocId = DocumentsContract.getDocumentId(intent.getData()); String[] strSplittedDocId = strDocId.split(":"); String strId = strSplittedDocId[strSplittedDocId.length - 1]; Cursor crsCursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI , new String[] {MediaStore.MediaColumns.DATA} , "_id=?", new String []{strId}, null ); assert crsCursor != null; crsCursor.moveToFirst(); String path2 = crsCursor.getString(0); crsCursor.close(); return path2; }

ギャラリーから正しい向きで画像を取得,表示できない原因と解決策が分かる方がいらっしゃれば,ご教授ください.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JPG画像はそのEXIF情報の中に画像の向きを表す情報があり、それに合わせて画像を回転させる必要があります

JPEG画像のEXIF情報を修正して写真の表示の向きを直す

投稿2020/08/14 06:41

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xue

2020/08/14 07:37

ご回答ありがとうございます。 同じJPG画像を選択して表示する際に,回転できる時とできない時があるのはなぜでしょうか? もしご存知でしたらご教授ください.
xue

2020/08/14 07:46 編集

if (degree != 0) { exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "0"); exifInterface.saveAttributes(); } 失礼します. ご回答を参考にコードを見たところ,上記の部分で角度が0でない場合に0にして保存するよう処理をしていたため2度目以降同じ画像を表示する際に向きが変わっていたことが分かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問