的Android图片缩小和保存EXIF数据(取向,旋转等)(Android Image Resizi

2019-07-04 04:39发布

如果您的Android应用使用设备的相机拍照,然后调整它的大小(这是很常见的,以减少上传大小),你可能没有意识到,这个调整操作的EXIF元数据。

这可能会导致问题,尤其是如果有问题的设备依赖于“定位”标签正确显示图像直立。

不同的Android设备不同的方式处理相机/图像旋转 - 我信赖的醇”的Nexus One似乎永远旋转图像后立即拍摄,因此该文件的本地内容总是‘看时直立’。 然而,其他设备(尤其是三星手机在我的测试), 旋转图像文件的内容-相反,他们设置了EXIF“定位”的标签。 每当后来显示的图像,相关图像的代码应该检测取向“标签”的存在并适当地旋转图像。 但是,如果你做任何位图处理的图像并将其保存到一个新的文件,所有的EXIF数据的丢失。

除了定位数据,你也可能会失去其他有价值的元数据,例如品牌/型号等。

这让我感到困惑的几个星期(在手机图库中显示时,但随后到达我的坏方向,并且没有明显的元数据服务器上的图像直立出现)。 我在这里将这种自我问题去帮助别人。 本博客文章是非常有益的:

http://vikaskanani.wordpress.com/2011/07/17/android-re-size-image-without-loosing-exif-information/

Answer 1:

正如其他人所指出的,你必须从原始图像复制的EXIF数据到最终调整图像。 该Sanselan的Android库通常是最适合这个。 根据Android操作系统的版本,ExifInterface有时候会损坏EXIF数据。 此外,ExifInterface也处理的Exif标签的数量有限的 - 即只有标签,它“知道”。 在另一方面Sanselan将保留所有EXIF标签和标记笔记。

这里是一个博客帖子里介绍如何使用Sanselan复印的图像数据: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/

顺便说一句,在Android上我也倾向于旋转图像并删除定位EXIF标签。 例如,在与Android 4.03使用Nexus S,相机被设置在EXIF元数据的取向标记,但web视图被忽略了信息和错误地显示图像。 可悲的是,旋转实际图像数据,删除的EXIF方向标签是让每一个程序可以正确显示图像的唯一途径。



Answer 2:

[自答案]

AFAICT, 没有机制来自动持续元数据或甚至任何快照是存在的,在批量传输。

相反,它似乎你必须明确地检查特定的属性和自己将它们复制到使用ExifInterface新的图像文件。

http://developer.android.com/reference/android/media/ExifInterface.html

因此,像:

ExifInterface oldExif = new ExifInterface(oldImagePath);
String exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION);

if (exifOrientation != null) {
   ExifInterface newExif = new ExifInterface(imagePath);
   newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation);
   newExif.saveAttributes();
}


Answer 3:

对于懒惰的,这里有一个可重复使用的功能:

public static void copyExif(String oldPath, String newPath) throws IOException
{
    ExifInterface oldExif = new ExifInterface(oldPath);

    String[] attributes = new String[]
    {
            ExifInterface.TAG_APERTURE,
            ExifInterface.TAG_DATETIME,
            ExifInterface.TAG_DATETIME_DIGITIZED,
            ExifInterface.TAG_EXPOSURE_TIME,
            ExifInterface.TAG_FLASH,
            ExifInterface.TAG_FOCAL_LENGTH,
            ExifInterface.TAG_GPS_ALTITUDE,
            ExifInterface.TAG_GPS_ALTITUDE_REF,
            ExifInterface.TAG_GPS_DATESTAMP,
            ExifInterface.TAG_GPS_LATITUDE,
            ExifInterface.TAG_GPS_LATITUDE_REF,
            ExifInterface.TAG_GPS_LONGITUDE,
            ExifInterface.TAG_GPS_LONGITUDE_REF,
            ExifInterface.TAG_GPS_PROCESSING_METHOD,
            ExifInterface.TAG_GPS_TIMESTAMP,
            ExifInterface.TAG_IMAGE_LENGTH,
            ExifInterface.TAG_IMAGE_WIDTH,
            ExifInterface.TAG_ISO,
            ExifInterface.TAG_MAKE,
            ExifInterface.TAG_MODEL,
            ExifInterface.TAG_ORIENTATION,
            ExifInterface.TAG_SUBSEC_TIME,
            ExifInterface.TAG_SUBSEC_TIME_DIG,
            ExifInterface.TAG_SUBSEC_TIME_ORIG,
            ExifInterface.TAG_WHITE_BALANCE
    };

    ExifInterface newExif = new ExifInterface(newPath);
    for (int i = 0; i < attributes.length; i++)
    {
        String value = oldExif.getAttribute(attributes[i]);
        if (value != null)
            newExif.setAttribute(attributes[i], value);
    }
    newExif.saveAttributes();
}


文章来源: Android Image Resizing and Preserving EXIF data (Orientation, Rotation, etc)