来自画廊/相机意图的图片方向

时间:2010-12-23 09:58:04

标签: android orientation image

我正在通过相机/图库意图将照片添加到我的应用中。在许多手机中,我从意图/ Uri中读取的图片已经旋转到正确的方向。例如N1,Legend,Desire就是这种情况。

但是在某些手机上(例如Milestone1,GalaxyS),无论拍摄照片的方式如何,照片总是在风景中。这意味着在我的应用程序中,纵向图片以错误的方式呈现给用户。我试图读取图片的EXIF信息,但方向标记始终为0.必须有一种方法来找出图片的正确方向,因为在Milestone1中,图库应用程序正确显示肖像图片。

如何在向用户展示之前我是否需要自己旋转图片?

谢谢你的帮助!

12 个答案:

答案 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)

以下方法以度为单位返回图像的方向。它适用于图库中的图像。返回值:

  • normal landscape:0
  • 普通人像:90
  • 颠倒的景观:180
  • 颠倒的肖像:270
  • 未找到图片:-1

代码:

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