Android相机意图在拍摄肖像时保存图像为横向。
问题:在使用相机拍摄照片时,无论设备是竖直还是水平,照片始终以设备内置相机的方向拍摄。为了使图像正确旋转,您需要读取存储在照片中的方向信息(EXIF元数据)。以下是一段读取EXIF数据并相应旋转图像的代码:
file是图像文件的名称。 BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, bounds); BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeFile(file, opts); ExifInterface exif = new ExifInterface(file); String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; int rotationAngle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; Matrix matrix = new Matrix(); matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2); Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
更新于2017-01-16:
随着25.1.0支持库的发布,引入了ExifInterface支持库,这可能使得访问Exif属性更加简单。请参阅Android开发者博客上的文章。
问题原因:照片始终以设备内置相机的方向拍摄,无法自动旋转图像。
解决方法:读取照片的EXIF元数据,并根据方向信息旋转图像。
问题原因:在某些设备上,使用常见的解决方法无法解决前后摄像头拍摄图片方向不一致的问题。
解决方法:使用CameraInfo来获取摄像头的信息,然后根据该信息对图片进行旋转。
mCurrentCameraId的来源未提及。
以下是完整
在某些设备上,使用常见的解决方法无法解决前后摄像头拍摄图片方向不一致的问题。对于需要在三星和其他主要制造商设备上同时适用于前后摄像头的另一种解决方案,请参考nvhausid在stackoverflow上的回答:
https://stackoverflow.com/a/18915443/6080472
对于不想点击链接的人,关键的解决方法是使用CameraInfo而不是依赖于EXIF或媒体文件上的Cursor。
Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length); android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(mCurrentCameraId, info); Bitmap bitmap = rotate(realImage, info.orientation);
完整的代码请参考链接。
然而,这个解决方法也没有生效。其中,mCurrentCameraId的来源未提及。