从流中手动提取 EXIF 并将其附加到 JPEG 文件
Manually extract EXIF from stream and attach it to JPEG file
给定一张图片 Uri
,我需要将图片保存到我的应用程序的缓存目录中。我正在使用 InputStream
从 Uri
中提取 bitmap
,因为 Uri
可能来自 MediaStore
或其他应用程序的内容 Uri
(示例 Google Photos) 和 filePath 在所有情况下都不能安全地导出。
由于在android Marshmallow
及以下没有从InputStream
或FileDescriptor
读取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 副本加载位图。
给定一张图片 Uri
,我需要将图片保存到我的应用程序的缓存目录中。我正在使用 InputStream
从 Uri
中提取 bitmap
,因为 Uri
可能来自 MediaStore
或其他应用程序的内容 Uri
(示例 Google Photos) 和 filePath 在所有情况下都不能安全地导出。
由于在android Marshmallow
及以下没有从InputStream
或FileDescriptor
读取EXIF
的方法,我使用this 具有 InputStream
.
我想要的是,当我从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 副本加载位图。