Android图片来自画廊错误的方向

时间:2012-10-12 13:22:58

标签: android image android-intent orientation exif

我正在使用意图从Android图库加载图片。在我试过的一些设备上它工作正常,但在某些设备上似乎图像以错误的方向加载。它通常以横向而非肖像显示。

我做了一些搜索并找到了一些关于EXIF数据的建议并尝试了以下内容:

            if(resultCode == RESULT_OK){

                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                Cursor cursor = getContentResolver().query(
                                   selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                cursor.close();

                String myFile = selectedImage.toString();
                int orientation = 0;
                try {
                    ExifInterface exif = new ExifInterface(myFile);
                    orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
                Bitmap rotatedBitmap = null;
                Matrix matrix = new Matrix();

                switch(orientation){

                    case 3:

                        matrix.postRotate(180);
                        break;

                    case 6:

                        matrix.postRotate(90);
                        break;

                    case 8:

                        matrix.postRotate(270);
                        break;

                }

                rotatedBitmap = Bitmap.createBitmap(yourSelectedImage, 0, 0, yourSelectedImage.getWidth(), yourSelectedImage.getHeight(), matrix, true);
                _mJazzView.setBackground(rotatedBitmap);

            }

这并没有解决问题,在尝试了进一步搜索的几个变化后,我似乎无法以正确的方向加载它。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

希望现在提供帮助还为时不晚!我遇到过这个问题,我想很多人都没有意识到这一点,因为他们没有很多设备可以测试。无论如何,这是我通过查看基于AOSP的这个作品库https://github.com/jdamcd/android-crop的类找到的解决方案。这是一个复制粘贴作业,因此应该很容易进入您的项目。为格式化道歉,我与这个评论框搏斗并输了。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent,"whatever you want",1);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case 1:
        if (resultCode == RESULT_OK)
        {
            Uri selectedImage = data.getData();
            int rotationInDegrees = getRotationInDegrees(selectedImage);
        }
        break;
    }
 }

private int getRotationInDegrees(Uri uri)
{
     return ImageOrientationUtil
    .getExifRotation(ImageOrientationUtil
    .getFromMediaUri(
        this,
        getContentResolver(),
        uri));


}

ImageOrientationUtil.class

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import java.io.Closeable;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class ImageOrientationUtil
{

    private static final String SCHEME_FILE = "file";
    private static final String SCHEME_CONTENT = "content";

    public static void closeSilently(@Nullable Closeable c) {
        if (c == null) return;
        try {
            c.close();
        } catch (Throwable t) {
       // Do nothing
     }
   }

   public static int getExifRotation(File imageFile) {
       if (imageFile == null) return 0;
       try {
           ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
    // We only recognize a subset of orientation tag values
    switch (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED)) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            return 90;
        case ExifInterface.ORIENTATION_ROTATE_180:
            return 180;
        case ExifInterface.ORIENTATION_ROTATE_270:
            return 270;
        default:
            return ExifInterface.ORIENTATION_UNDEFINED;
    }
    } catch (IOException e) {
  //  Log.e("Error getting Exif data", e);
    return 0;
   }
}

@Nullable
public static File getFromMediaUri(Context context,
ContentResolver  resolver,  Uri uri) {
if (uri == null) return null;
if (SCHEME_FILE.equals(uri.getScheme())) {
     return new File(uri.getPath());
   } else if (SCHEME_CONTENT.equals(uri.getScheme())) {
    final String[] filePathColumn = { MediaStore.MediaColumns.DATA,   MediaStore.MediaColumns.DISPLAY_NAME };
    Cursor cursor = null;
    try {
        cursor = resolver.query(uri, filePathColumn, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            final int columnIndex = (uri.toString().startsWith("content://com.google.android.gallery3d")) ?
                cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME) :
                cursor.getColumnIndex(MediaStore.MediaColumns.DATA);
            // Picasa images on API 13+
            if (columnIndex != -1) {
                String filePath = cursor.getString(columnIndex);
                if (!TextUtils.isEmpty(filePath)) {
                    return new File(filePath);
                }
            }
        }
    } catch (IllegalArgumentException e) {
        // Google Drive images
        return getFromMediaUriPfd(context, resolver, uri);
    } catch (SecurityException ignored) {
        // Nothing we can do
    } finally {
        if (cursor != null) cursor.close();
    }
}
return null;
}

private static String getTempFilename(Context context) throws IOException {
    File outputDir = context.getCacheDir();
    File outputFile = File.createTempFile("image", "tmp", outputDir);
    return outputFile.getAbsolutePath();
}

@Nullable
private static File getFromMediaUriPfd(Context context, ContentResolver    resolver, Uri uri) {
if (uri == null) return null;

FileInputStream input = null;
FileOutputStream output = null;
try {
    ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
    FileDescriptor fd = pfd.getFileDescriptor();
    input = new FileInputStream(fd);

    String tempFilename = getTempFilename(context);
    output = new FileOutputStream(tempFilename);

    int read;
    byte[] bytes = new byte[4096];
    while ((read = input.read(bytes)) != -1) {
        output.write(bytes, 0, read);
    }
    return new File(tempFilename);
   } catch (IOException ignored) {
    // Nothing we can do
  } finally {
    closeSilently(input);
    closeSilently(output);
  }
  return null;
  }
}