ExifInterface返回错误的方向(因为它存储了多个冲突的属性)

时间:2018-05-23 05:42:08

标签: android android-camera jpeg orientation

我正在编写一个从图库中提取照片的Android应用。我发现了一些照片,例如由Galaxy S7向左方向拍摄的全景图由内置相机应用程序输出为“非标准化jpeg”文件,意味着图像上下颠倒(甚至垂直于Galaxy S5上的风景全景图) ),但它包含EXIF数据中的说明,观众应该修复它。

所以我读了ExifInterface并实现了代码来规范化图像:

                ExifInterface exif = new ExifInterface(file.toString());
                int orig = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
                if (orig != -1 && orig != ExifInterface.ORIENTATION_NORMAL) {
                    orientation = orig;
                    exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_NORMAL));
                    exif.saveAttributes();
                }

...

        Matrix matrix = null;
        if (orientation != ExifInterface.ORIENTATION_NORMAL) {
            matrix = new Matrix();
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:   matrix.postRotate(90); break;
                case ExifInterface.ORIENTATION_ROTATE_180:  matrix.postRotate(180); break;
                case ExifInterface.ORIENTATION_ROTATE_270:  matrix.postRotate(-90); break;
            }
        }

... 等

但是,在Galaxy S7上,我的代码无法正常工作。经过一些调试和深入研究系统源代码后,我发现ExifInterface对象为“Orientation”属性存储了多个冲突值,并且它返回了错误的值。正确的值(即3)存储在exif.mAttributes [4]中(这对应于IFD_THUMBNAIL_TAGS组?),不正确的值(即1)存储在exif.mAttributes [0]中(这对应于IFD_TIFF_TAGS?) 。所以'exif'报告它是ORIENTATION_NORMAL,但图像上下颠倒,我的矩阵代码没有被调用。

建议的解决方案是什么,或解决此问题的方法是什么?

0 个答案:

没有答案