使用 exif 旋转图像

Using exif to rotate an image

我正在按照这个 link Android get Orientation of a camera Bitmap? And rotate back -90 degrees 旋转我的图像 if/when 必要的,但它对我不起作用,我得到这个错误

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: 位图 uri 内容://com.android.providers.downloads.documents/document/508 0

//最后的0是我检查旋转

我想知道这是否是构建版本特定的,比如从 URI 获取真实路径,因为 运行 我的棉花糖设备上的这段代码给了我一个完全不同的结果(这个结果,即:错误代码,是来自 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;
}

非常感谢

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

这行不通。如果您在 Uri 上调用 getPath(),那您就错了,因为这对大多数 Uri 值来说毫无意义,尤其是那些具有 content 方案的值,就像您拥有的那样。

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