Android相机意图在拍摄肖像时保存图像为横向。

4 浏览
0 Comments

Android相机意图在拍摄肖像时保存图像为横向。

我已经查看了一下,但似乎没有一个确定的答案/解决方案来解决这个非常烦人的问题。

我以纵向方向拍照,当我点击保存/丢弃按钮时,按钮的方向也是正确的。问题是当我稍后检索图像时,它是横向方向的(图片被逆时针旋转90度)。

我不想强制用户在特定方向下使用相机。

也许有一种方法可以检测照片是否以纵向模式拍摄,然后解码位图并将其正确翻转过来吗?

0
0 Comments

问题:在使用相机拍摄照片时,无论设备是竖直还是水平,照片始终以设备内置相机的方向拍摄。为了使图像正确旋转,您需要读取存储在照片中的方向信息(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元数据,并根据方向信息旋转图像。

0
0 Comments

问题原因:在某些设备上,使用常见的解决方法无法解决前后摄像头拍摄图片方向不一致的问题。

解决方法:使用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的来源未提及。

0