使用exif旋转图像

时间:2016-05-28 22:46:09

标签: android bitmap uri exif

我正在关注此链接Android get Orientation of a camera Bitmap? And rotate back -90 degrees以便在必要时轮换我的图片,但它不适用于我,我收到此错误

05-28 23:29:30.049 9735-9735 / ss.sealstudios.com.socialstories E / JHEAD:无法打开'/ document / 508'

但是像下面那样检查就好像指向正确的位置

05-28 23:29:30.049 9735-9735 / ss.sealstudios.com.socialstories I / System.out:bitmap uri content://com.android.providers.downloads.documents/document/508 0

//最后的0是我检查轮换

我想知道这是否是特定版本的版本,比如从URI获取真实路径,因为在我的marshmallow设备上运行此代码会给我一个完全不同的结果(这个结果,即:错误代码,来自kitkat设备),但这已经打败了我好几个星期了,各种各样的答案无济于事,任何人都可以帮我讨厌,这就是我想要做的事情

   if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data 
   != null 
   && data.getData() != null) 
  {

        Uri uri = data.getData();


        try {
            BitmapFactory.Options bitmapOptions = new 
            BitmapFactory.Options();
            bitmapOptions.inSampleSize = (int) 4;
            InputStream inputStream = 
            getContentResolver().openInputStream(uri);
            Bitmap scaledBitmap = BitmapFactory.decodeStream(inputStream, 
            null, bitmapOptions);
            ExifInterface exif = new ExifInterface(uri.getPath());
            int rotation = 
            exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,  
            ExifInterface.ORIENTATION_NORMAL);
            int rotationInDegrees = exifToDegrees(rotation);
            System.out.println("bitmap uri " + uri + " " + rotation);
            Matrix matrix = new Matrix();

            if (rotation != 0f){
                matrix.preRotate(rotationInDegrees);
                Bitmap.createBitmap(scaledBitmap, 0, 
                0,scaledBitmap.getWidth(),scaledBitmap.getHeight(), 
                matrix, true);
                imageView.setImageBitmap(scaledBitmap);

            }else
                imageView.setImageBitmap(scaledBitmap);

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
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;
}
非常感谢

1 个答案:

答案 0 :(得分:0)

ExifInterface exif = new ExifInterface(uri.getPath());

这不起作用。如果您在getPath()上致电Uri,那么您做错了,因为这对于大多数Uri值来说毫无意义,特别是那些content方案的值,就像您的那样。

由于SDK的ExifInterface仅适用于本地文件,因此您需要其他EXIF代码。我使用some code from the AOSP for this。该版本的ExifInterface可以与InputStream一起使用,因此您可以为InputStream标识的内容获取新的Uri,并将其传递给替代ExifInterface }。