ram*_*111 35 android image image-gallery android-intent android-camera
我已经浏览了一些链接,以获得从默认图库中选择的图像的正确图像方向,以便在exif标记始终返回0的所有设备中标准化.
对于使用肖像相机应用程序android拍摄的图像,EXIF方向标记值始终为0
http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-android/
如何获得适用于所有设备的精确解决方案?
ram*_*ral 103
如果图像(照片)是由您制作的程序拍摄的,则必须使用正确的旋转值设置Parameters.setRotation.
这取决于相机驱动,在保存之前旋转图像或将旋转值保存到exif TAG_ORIENTATION.
因此,如果TAG_ORIENTATION为null或零,则图像的方向正确,否则您必须根据TAG_ORIENTATION中的值旋转图像.
码
从EXIF获取方向:
ExifInterface exif = null;
try {
exif = new ExifInterface(path);
} catch (IOException e) {
e.printStackTrace();
}
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
Run Code Online (Sandbox Code Playgroud)
旋转位图:
Bitmap bmRotated = rotateBitmap(bitmap, orientation);
Run Code Online (Sandbox Code Playgroud)
旋转位图的方法:
public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
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;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,ExifInterface 工作得很好,就像这样:
ExifInterface exifInterface = new ExifInterface(imagePath);
degree = Integer.parseInt(exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION));
Run Code Online (Sandbox Code Playgroud)
或者您可以尝试使用以下方法获取图像的详细信息MediaStore:
String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = managedQuery(imageUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Run Code Online (Sandbox Code Playgroud)
类似的解决方案:ExifInterface 总是返回 1
希望能帮助到你.. :)
| 归档时间: |
|
| 查看次数: |
69789 次 |
| 最近记录: |