Android ExifInterface如何在保存属性时不覆盖以前的数据?

10

我正在尝试将经纬度和其他数据写入我的自定义相机应用程序中jpeg的Exif头。通常情况下,Android会自动填充头部数据,例如光圈、ISO、快门速度等。然而,当我手动创建一个ExifInterface实例、使用SetAttributes()设置GPS位置并调用SaveAttributes()时,所有其他相机数据都会消失。

这是应该发生的吗?我怎样才能简单地添加一个标签而不覆盖其他数据?

我在其他地方看到过一个例子,其中创建了两个ExifInterfaces,一个旧的(来自图片)和一个新的,并将旧的中的每个填充值以及任何其他数据复制到新的中。然而,这很麻烦而且很费时间。我希望找到一个更好的解决方案。

这是我的代码:

try{ 
    ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath());
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms());
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms());
    exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms());
    exif.saveAttributes(); 
} catch(IOException e){
    e.printStackTrace(); 
}
感谢。

我不确定为什么你会遇到这种情况。我尝试了你提到的相同方法,我的EXIF数据没有被覆盖。只有在保存属性后我的GPS位置被修改。 在以下设备上进行了测试, Nexus Prime - 4.2.1 Motorola Moto E - 4.4.4 - Ajith M A
1个回答

0

从我看到的文档来看,这不应该发生。 http://developer.android.com/reference/android/media/ExifInterface.html

public void saveAttributes ()

Added in API level 5
Save the tag data into the JPEG file. This is expensive because it involves copying all the JPG data from one file to another and deleting the old file and renaming the other. It's best to use setAttribute(String, String) to set all attributes to write and make a single call rather than multiple calls for each attribute.

Throws
IOException 

它清楚地表示正在复制所有数据,包括您说正在消失的东西。 你能发一下你在测试什么吗? 如果你在使用Android Studio,你可以尝试文件 -> 无效缓存/重启 -> 无效和重启。

另外我在这里找到了一个类似问题的答案关于数据丢失: https://dev59.com/JGYr5IYBdhLWcg3wi6s_#13784057

正如其他人所指出的,您必须将原始图像的EXIF数据复制到最终调整大小的图像中。Sanselan Android库通常最适合此操作。根据Android操作系统版本,ExifInterface有时会破坏EXIF数据。此外,ExifInterface还处理有限数量的Exif标签--即仅“知道”的标签。另一方面,Sanselan将保留所有EXIF标记和标记注释。 以下是一篇博客文章,展示了如何使用Sanselan复制图像数据: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/ 顺便说一下,在Android上,我也倾向于旋转图像并删除Orientation EXIF标签。例如,在安装有Android 4.03的Nexus S上,相机在EXIF元数据中设置了方向标签,但webview忽略了该信息并显示了错误的图像。不幸的是,旋转实际图像数据并删除EXIF方向标签是使每个程序正确显示图像的唯一方法。 希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接