为什么三星Android设备中的旋转不起作用?

时间:2014-03-01 20:05:59

标签: android bitmap rotation samsung-mobile

我尝试制作一个应用程序,允许用户从图库/拍照中选择图像,并将结果设置为位图。当我测试应用程序时,我发现三星设备的轮换是错误的。

搜索了一段时间后,我发现旋转不是谷歌定义的,但制造商本身和三星似乎有一些不同的设置。此外,还有一些建议使用另一种方法来检查旋转。

如何解决问题? (注意:不仅拍摄照片,而且画廊中的图片也有相同的旋转问题)

以下是从提供的文件路径获取getbitmap的代码:

  private Bitmap getBitmap(String path) {

        Uri uri = getImageUri(path);
        InputStream in = null;
        try {
            in = mContentResolver.openInputStream(uri);

            //Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;

            BitmapFactory.decodeStream(in, null, o);
            in.close();

            int scale = 1;
            if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
                scale = (int) Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
            }

            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            in = mContentResolver.openInputStream(uri);
            Bitmap b = BitmapFactory.decodeStream(in, null, o2);
            in.close();

            return b;
        } catch (FileNotFoundException e) {
            Log.e(TAG, "file " + path + " not found");
        } catch (IOException e) {
            Log.e(TAG, "file " + path + " not found");
        }
        return null;
    }

感谢您的帮助

1 个答案:

答案 0 :(得分:5)

我认为你正在寻找的是从图像中读取exif旋转并相应地旋转它。我知道三星设备存在问题,图像没有正确的方式,但你可以这样纠正:

首先,你必须从图像中读取Exif Rotation:

ExifInterface exif = new ExifInterface(pathToFile);  
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

使用此信息可以纠正图像的旋转,遗憾的是这有点复杂,它涉及用矩阵旋转位图。您可以像这样创建矩阵:

Matrix matrix = new Matrix();
switch (rotation) {
    case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
        matrix.setScale(-1, 1);
        break;

    case ExifInterface.ORIENTATION_ROTATE_180:
        matrix.setRotate(180);
        break;

    case ExifInterface.ORIENTATION_FLIP_VERTICAL:
        matrix.setRotate(180);
        matrix.postScale(-1, 1);
        break;

    case ExifInterface.ORIENTATION_TRANSPOSE:
        matrix.setRotate(90);
        matrix.postScale(-1, 1);
        break;

    case ExifInterface.ORIENTATION_ROTATE_90:
        matrix.setRotate(90);
        break;

    case ExifInterface.ORIENTATION_TRANSVERSE:
        matrix.setRotate(-90);
        matrix.postScale(-1, 1);
        break;

    case ExifInterface.ORIENTATION_ROTATE_270:
        matrix.setRotate(-90);
        break;

    case ExifInterface.ORIENTATION_NORMAL:        
    default:
        break;
}

最后,您可以创建正确旋转的位图:

int height = bitmap.getHeight();
int width = bitmap.getWidth();
Bitmap correctlyRotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);

为了避免OutOfMemory Exceptions,你应该在创建正确旋转的位图之后回收旧的未正确旋转的位图:

bitmap.recycle();