我正在编写一个从图库中提取照片的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,但图像上下颠倒,我的矩阵代码没有被调用。
建议的解决方案是什么,或解决此问题的方法是什么?