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情報通りの角度で表示されるようになります。
今回は保存しましたが、表示にのみ使用することも可能です。