如何确定图库中的图像是从相机拍摄的肖像还是风景
How to find out if the image from the gallery was taken in portrait or landscape from camera
- 我在图库中有一张用相机拍摄的图片
- 我想知道图像是
portrait
还是 landscape
我从下面code得到的路径为
/storage/emulated/0/DCIM/Camera/IMG_20181110_211757.jpg
然后我用ExifInterface找方向:
public static void getCameraPhotoOrientation(Activity activity, String imagePath) {
String path =getPath(activity,imagePath);
try {
ExifInterface ei = new ExifInterface(path);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
Timber.d("Type-1");
break;
case ExifInterface.ORIENTATION_ROTATE_180:
Timber.d("Type-2");
break;
case ExifInterface.ORIENTATION_ROTATE_90:
Timber.d("Type-3");
break;
case ExifInterface.ORIENTATION_UNDEFINED:
Timber.d("Type-4");
break;
}
}catch (IOException ex){
ex.printStackTrace();
}
}
我的方向总是ExifInterface.ORIENTATION_UNDEFINED
如何解决这个问题
像下面这样改变路径访问过程试试
File imFile = new File(imagePath);
ExifInterface ei = new ExifInterface(imFile.getAbsolutePath());
这将解释Android getAbsolutePath() not returning full path它
I have a image in gallery which was taken from camera
开发人员无法保证任何特定图像都来自相机应用,除非开发人员是该相机应用的作者。
I am trying to find out if the image is portrait or landscape
没有要求图片必须是纵向或横向。例如,相机应用可能会将其照片裁剪为圆形或方形。
I have the path obtained from below code
对于许多设备上的许多 Uri
值,该代码将失败。如果要对 Uri
使用 ExifInterface
,请使用 getContentResolver().openInputStream()
在 Uri
标识的内容上获得 InputStream
,然后传递 [=14] =] 到 this ExifInterface
constructor.
I always get orientation as ExifInterface.ORIENTATION_UNDEFINED
图片不必有 EXIF headers,更不用说 ExifInterface.TAG_ORIENTATION
.
如果该标签不存在,您可以检查图像的宽度和高度并进行猜测:
- 如果宽度大于高度,则可能是横向
- 如果高度大于宽度,则可能是纵向
这对于方形图像将失败,对于裁剪图像将失败(例如,照片是纵向拍摄的,但用户将其裁剪为现在宽度大于高度)。
最好的解决方案是将您的应用更改为不关心图像是纵向还是横向。 next-best 解决方案是询问用户他们希望如何处理图像,其中也许您使用上述算法设置默认选项。
- 我在图库中有一张用相机拍摄的图片
- 我想知道图像是
portrait
还是landscape
我从下面code得到的路径为
/storage/emulated/0/DCIM/Camera/IMG_20181110_211757.jpg
然后我用ExifInterface找方向:
public static void getCameraPhotoOrientation(Activity activity, String imagePath) {
String path =getPath(activity,imagePath);
try {
ExifInterface ei = new ExifInterface(path);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
Timber.d("Type-1");
break;
case ExifInterface.ORIENTATION_ROTATE_180:
Timber.d("Type-2");
break;
case ExifInterface.ORIENTATION_ROTATE_90:
Timber.d("Type-3");
break;
case ExifInterface.ORIENTATION_UNDEFINED:
Timber.d("Type-4");
break;
}
}catch (IOException ex){
ex.printStackTrace();
}
}
我的方向总是ExifInterface.ORIENTATION_UNDEFINED
如何解决这个问题
像下面这样改变路径访问过程试试
File imFile = new File(imagePath);
ExifInterface ei = new ExifInterface(imFile.getAbsolutePath());
这将解释Android getAbsolutePath() not returning full path它
I have a image in gallery which was taken from camera
开发人员无法保证任何特定图像都来自相机应用,除非开发人员是该相机应用的作者。
I am trying to find out if the image is portrait or landscape
没有要求图片必须是纵向或横向。例如,相机应用可能会将其照片裁剪为圆形或方形。
I have the path obtained from below code
对于许多设备上的许多 Uri
值,该代码将失败。如果要对 Uri
使用 ExifInterface
,请使用 getContentResolver().openInputStream()
在 Uri
标识的内容上获得 InputStream
,然后传递 [=14] =] 到 this ExifInterface
constructor.
I always get orientation as ExifInterface.ORIENTATION_UNDEFINED
图片不必有 EXIF headers,更不用说 ExifInterface.TAG_ORIENTATION
.
如果该标签不存在,您可以检查图像的宽度和高度并进行猜测:
- 如果宽度大于高度,则可能是横向
- 如果高度大于宽度,则可能是纵向
这对于方形图像将失败,对于裁剪图像将失败(例如,照片是纵向拍摄的,但用户将其裁剪为现在宽度大于高度)。
最好的解决方案是将您的应用更改为不关心图像是纵向还是横向。 next-best 解决方案是询问用户他们希望如何处理图像,其中也许您使用上述算法设置默认选项。