使用 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
.
我正在按照这个 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
.