从流中手动提取 EXIF 并将其附加到 JPEG 文件

Manually extract EXIF from stream and attach it to JPEG file

给定一张图片 Uri,我需要将图片保存到我的应用程序的缓存目录中。我正在使用 InputStreamUri 中提取 bitmap,因为 Uri 可能来自 MediaStore 或其他应用程序的内容 Uri(示例 Google Photos) 和 filePath 在所有情况下都不能安全地导出。

由于在android Marshmallow及以下没有从InputStreamFileDescriptor读取EXIF的方法,我使用this 具有 InputStream.

的 Exif 构造函数的库

我想要的是,当我从Uri中提取bitmap并将其写入缓存目录中的JPEG文件时,我想拼接所有EXIF 由于某些业务需求(主要是旋转和经纬度),我从 InputStream 获取到此 JPEG 文件的数据。

我无法找到使用上述库的正确方法(不是很精通EXIF)。任何帮助将不胜感激。

这不是解决此类问题的正确方法。该流已经是一个 JPG,其中包含所有 EXIF 数据。您只需将流直接复制到您的应用程序缓存。

类似的东西:

// in is the inputstream that you got from the Uri
// dst is a file to your app internal cache
public void copy(Uri uri, File dst) throws IOException {
    InputStream in = contentResolver.openInputStream(uri);
    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

执行此操作后,原始 JPG 的副本将保存在您的应用程序本地缓存中,包括其所有 EXIF。之后,如果您想要位图(显示在屏幕上、应用效果或其他),那么您可以从 JPG 副本加载位图。