如何确定图库中的图像是从相机拍摄的肖像还是风景

How to find out if the image from the gallery was taken in portrait or landscape from camera

我从下面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 解决方案是询问用户他们希望如何处理图像,其中也许您使用上述算法设置默认选项。