Androidでカメラで撮った写真の向きを自動で補正する方法
Androidで撮った写真をアプリで表示すると横に傾いて表示される場合があると思います。
そういう時に写真のExif情報を元に正しい向きに回転する方法です。
まず、以下のようにして正しい回転角度を取得します。
private int getRotateDegree(String filePath) { int degree = 0; 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; } if (degree != 0) { exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "0"); exifInterface.saveAttributes(); } } catch (IOException e) { degree = -1; e.printStackTrace(); } return degree; }
Exif情報から正しい角度が取得できたので、
取得した角度を写真に反映する
public int rotateImage(String filePath) { filePath = filePath.replace("file://", ""); int degree = getRotateDegreeFromExif(filePath); if (degree > 0) { OutputStream out = null; Bitmap bitmap = null; Bitmap rotatedImage = null; try { Matrix mat = new Matrix(); mat.postRotate(degree); BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, opts); int width = 480; int scale = 1; if (opts.outWidth > width) { scale = opts.outWidth / width + 2; } opts.inJustDecodeBounds = false; opts.inSampleSize = scale; bitmap = BitmapFactory.decodeFile(filePath, opts); rotatedImage = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true); out = new FileOutputStream(filePath); rotatedImage.compress(Bitmap.CompressFormat.JPEG, 100, out); } catch (Exception ex) { ex.printStackTrace(); } finally { if (out != null) try { out.close(); } catch (IOException e) {} if (bitmap != null) bitmap.recycle(); if (rotatedImage != null) rotatedImage.recycle(); } } return degree; }
これで、画像はExif情報通りの角度で表示されるようになります。
今回は保存しましたが、表示にのみ使用することも可能です。
関連する記事:
- Androidで複数のImageViewを1枚の画像に合成保存する方法
- Androidでのカメラ連動するアプリでのカメラの呼び出し方とデータ取得方法
- AndroidのFaceDetectorの精度について
- AndroidでUriからファイルパスを取得する方法
- iPhoneでUILabelの高さ(height)を計算する方法
コメント 0