Android ImageView显示旋转的图像,尽管源未旋转

Android ImageView显示旋转的图像,尽管源未旋转,android,image,image-processing,bitmap,rotation,Android,Image,Image Processing,Bitmap,Rotation,我正在尝试在gridview中显示gallery图像,单击图像,打开图像的全屏视图。奇怪的是,当图像在画廊中显示时,它们遵循正确的旋转方向。但是,当我在自定义图库中查询照片时,它们总是逆时针旋转90度 我见过一些使用exif接口进行旋转的解决方案,因为它加载原始位图和新旋转的位图,所以需要内存进行旋转 我的问题是:为什么仅仅在ImageView中显示图库中的图像会导致图像旋转? 谢谢。首先,您需要创建一个ExiFinInterface: ExifInterface exif = new Exif

我正在尝试在gridview中显示gallery图像,单击图像,打开图像的全屏视图。奇怪的是,当图像在画廊中显示时,它们遵循正确的旋转方向。但是,当我在自定义图库中查询照片时,它们总是逆时针旋转90度

我见过一些使用exif接口进行旋转的解决方案,因为它加载原始位图和新旋转的位图,所以需要内存进行旋转

我的问题是:为什么仅仅在ImageView中显示图库中的图像会导致图像旋转?


谢谢。

首先,您需要创建一个ExiFinInterface:

ExifInterface exif = new ExifInterface(filename);
然后可以获取图像的方向:

orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
以下是方向值的含义:

因此,最重要的值是3、6和8。例如,如果方向为6,则可以如下方式旋转图像:

 Matrix matrix = new Matrix();
matrix.postRotate(90);
rotatedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(),       sourceBitmap.getHeight(), matrix, true);
这样做可以避免OOM错误 参考和

检查图像的旋转并正确显示…如图所示

    scaledBitmap=decodeSampledBitmapFromResource(.....);
    ExifInterface exif=null;
            try {
                exif = new ExifInterface(filePath);
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION, 0);
                Log.d("EXIF", "Exif: " + orientation);
                Matrix matrix = new Matrix();
                if (orientation == 6) {
                    matrix.postRotate(90);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 3) {
                    matrix.postRotate(180);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 8) {
                    matrix.postRotate(270);
                    Log.d("EXIF", "Exif: " + orientation);
                }
                scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                        scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                        true);
            } catch (IOException e) {
                e.printStackTrace();
            }

发生这种情况是因为所选图像的高度和宽度与其原始位置的显示不成比例好吧,我怀疑是这样的。但问题是每幅图像都有不同的高度和宽度。因此,让它们在栅格视图中采用它们所需的大小将使栅格视图看起来不规则。你有什么建议使它看起来对称,同时显示正确的旋转吗?好的,这看起来是一个很好的解决方案。据我所知,它不需要加载原始位图,对吗?因为如果它这样做,可能会给我一个OutOfMemoryError;有一个错误,第一个参数不应该是原始位图吗?好的,谢谢,我将尝试使用这些参数并返回给你。嗨,谢谢你的解决方案。但我试图避免加载两个位图,因为这会给我一个OutOfMemory错误。
    scaledBitmap=decodeSampledBitmapFromResource(.....);
    ExifInterface exif=null;
            try {
                exif = new ExifInterface(filePath);
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION, 0);
                Log.d("EXIF", "Exif: " + orientation);
                Matrix matrix = new Matrix();
                if (orientation == 6) {
                    matrix.postRotate(90);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 3) {
                    matrix.postRotate(180);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 8) {
                    matrix.postRotate(270);
                    Log.d("EXIF", "Exif: " + orientation);
                }
                scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                        scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                        true);
            } catch (IOException e) {
                e.printStackTrace();
            }