[解決済み] Androidの一部の端末で、カメラインテントで撮影した画像が回転してしまうのはなぜですか?
2022-03-22 14:32:31
質問
画像をキャプチャしてイメージビューに設定しています。
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// imageView.setImageBitmap(bitmap);
imageView.setImageURI(imageUri);
}
else {
}
}
public Bitmap getBitmapFromUri() {
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
return bitmap;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
しかし、問題は、あるデバイスでは、画像が回転するたびに、回転してしまうことです。例えば、Samsungのデバイスでは問題なく動作しますが ソニーXperia 画像は90度回転してしまいます。 東芝Thrive (タブレット)を180度回転させます。
解決方法は?
ほとんどの携帯電話のカメラは横長です。つまり、縦長で写真を撮ると、出来上がった写真は90度回転したものになります。この場合、カメラソフトが入力するのは Exif のデータには、写真を見るべき方向が含まれています。
以下の解決策は、カメラソフトウェア/デバイスメーカーがExifデータを入力することに依存するため、ほとんどの場合うまくいきますが、100%信頼できる解決策ではないことに注意してください。
ExifInterface ei = new ExifInterface(photoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
Bitmap rotatedBitmap = null;
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotatedBitmap = rotateImage(bitmap, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotatedBitmap = rotateImage(bitmap, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotatedBitmap = rotateImage(bitmap, 270);
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
rotatedBitmap = bitmap;
}
以下は
rotateImage
メソッドを使用します。
public static Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
matrix, true);
}
関連
-
adb devices OffLine Solution(オフラインソリューション
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
gitlab 設定エラー。リモートリポジトリから読み込めなかったか、ホストキーの検証に失敗しました。
-
Androidで発生した問題、解決策とヒント
-
最新のandroidプロジェクトディレクトリにあるarmeabi-v7aとarmeabiの具体的な意味とその違いを教えてください。
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
プロセス 'command 'F:\sdkbuild-tools', 26.0.2 AAAPT.exe' finished with non-zero exit value 1
-
アンドロイドのエリプサイズを使用する
-
アンドロイドシェイプ、グラデーション、角丸、ボーダーラインの設定
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AAPT2エラーについて:詳しくはログをご確認ください。
-
adb devices OffLine Solution(オフラインソリューション
-
Android Studio を 3.6.3 にアップデートした後、構成 :classpath のアーティファクトをすべて解決できない。
-
Android: インポートモジュールエラー Android リソースのリンクに失敗しました
-
IllegalStateException。ArrayAdapter は、リソース ID が TextView である必要があります。
-
ActivityはOnFragmentInteractionListenerを実装しなければならないに関する質問
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
アンドロイドにおけるトークンの利用
-
[解決済み】URIから実パスを取得、Android KitKatの新ストレージアクセスフレームワーク【重複あり