我正在通过相机/图库意图将照片添加到我的应用中。在许多手机中,我从意图/ Uri中读取的图片已经旋转到正确的方向。例如N1,Legend,Desire就是这种情况。
但是在某些手机上(例如Milestone1,GalaxyS),无论拍摄照片的方式如何,照片总是在风景中。这意味着在我的应用程序中,纵向图片以错误的方式呈现给用户。我试图读取图片的EXIF信息,但方向标记始终为0.必须有一种方法来找出图片的正确方向,因为在Milestone1中,图库应用程序正确显示肖像图片。
如何在向用户展示之前我是否需要自己旋转图片?
谢谢你的帮助!
答案 0 :(得分:25)
Florian的回答是针对画廊图片。
以下代码适用于捕获的图像,没有尝试使用图库图像,但我相信它应该可行。希望这有助于任何人。
代码:
public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
int rotate = 0;
try {
context.getContentResolver().notifyChange(imageUri, null);
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
Log.v(TAG, "Exif orientation: " + orientation);
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
修改强> 正如可以在评论中看到的,有些设备不支持Exif信息,没有检查哪个,但我认为HTC没有。一定要检查哪些设备并创建替代设备。
答案 1 :(得分:16)
以下方法以度为单位返回图像的方向。它适用于图库中的图像。返回值:
代码:
public static int getOrientation(Context context, Uri photoUri) {
Cursor cursor = context.getContentResolver().query(photoUri,
new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
null, null, null);
try {
if (cursor.moveToFirst()) {
return cursor.getInt(0);
} else {
return -1;
}
} finally {
cursor.close();
}
}
答案 2 :(得分:3)
int rotate = 0;
try {
File imageFile = new File(sourcepath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
答案 3 :(得分:2)
这是我找到的最好的答案,ramaral。 https://stackoverflow.com/a/20480741/2258389
非常适合画廊或相机
答案 4 :(得分:1)
您必须首先使用contentresolver创建图库对象,然后将创建的uri传递给图像捕获意图。然后你可以查看exif数据,而不是图库方向数据。
答案 5 :(得分:1)
Matrix matrix = new Matrix();
ExifInterface exifReader = new ExifInterface(filePath);
int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
if (orientation ==ExifInterface.ORIENTATION_NORMAL) {
// Do nothing. The original image is fine.
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
matrix.postRotate(90);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
matrix.postRotate(180);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
matrix.postRotate(270);
}
答案 6 :(得分:1)
我对S1有同样的问题,我注意到即使你使用股票库应用程序打开图像,它也会以横向模式打开(手机不知道正确的照片方向)。
如果您在相机应用程序中将手机旋转为肖像,图标(拍摄照片,对焦和设置)将不会旋转,请尝试在S2或任何设备支持横向/纵向照相机中旋转这些图标。
我确信相机应用程序不支持按比例模式拍照。
答案 7 :(得分:0)
我已经为一个项目做了那个,因为我有同样的问题(Android认为你只会在风景上做一张照片)。我所做的是当时检测手机方向,然后旋转图像。但是,当收到意图时,它假设方向仍然相同。
答案 8 :(得分:0)
这看起来与此问题中解决的问题相同: Android: Bitmaps loaded from gallery are rotated in ImageView
答案 9 :(得分:0)
以这种方式使用它!
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
return 90;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
return 180;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
return 270;
}
return 0;
}
在代码中,
Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);
简单!
答案 10 :(得分:0)
我在做什么: 首先使用其元数据信息检查相机拍摄的图像的方向,如果我们在纵向中找到这个,那么我们必须将图像旋转90°,否则只显示。
要获取有关图像方向的信息,我们可以使用Exif界面。 就是这样!
答案 11 :(得分:0)
简单的exiftodegree只有在拍摄照片时能够始终如一地回答,并且我会使用它。对于那些在选择照片和获得正确方向时遇到问题的人,请在此处查看我的答案:Image Orientation - Android