是否有办法来调整JPEG图像文件(从文件系统文件系统),而不删除元数据(就像ImageMagicksconvert in.jpg -resize 50% out.jpg
)?调整大小的JPEG图像
我发现调整.jpg文件的唯一方法是找到BitmapFactory.decodeStream
和Bitmap.compress
,如果手动需要传输图像元数据,这看起来像是很多开销。
是否有办法来调整JPEG图像文件(从文件系统文件系统),而不删除元数据(就像ImageMagicksconvert in.jpg -resize 50% out.jpg
)?调整大小的JPEG图像
我发现调整.jpg文件的唯一方法是找到BitmapFactory.decodeStream
和Bitmap.compress
,如果手动需要传输图像元数据,这看起来像是很多开销。
它可能会与android.media.ExifInterface读取元数据,通过Bitmap.compress
压缩图像,然后保存元数据回:
String filename = "yourfile.jpg";
// this reads all meta data
ExifInterface exif = new ExifInterface(filename);
// read and compress file
Bitmap bitmap = BitmapFactory.decodeFile(filename);
FileOutputStream fos = new FileOutputStream(filename);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
// write meta data back
exif.saveAttributes();
我没有测试它,但看source code of ExifInterface,它可能工作。 如果你不想依赖实现细节,你可以通过所有属性当然循环和复制。
的问题是什么“的原始图像文件”从saveAttributes()表示。这可能是和打开文件句柄或什么的。我想正确使用它的方法是有两个ExifInterface实例并将所有内容从一个拷贝到另一个。 –
@SimonWarta如果你看[源代码](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/media/ExifInterface .java#ExifInterface.saveAttributes%28%29),它没有打开的文件句柄(据我所知)。它使用文件名和属性作为参数调用本地方法。 – Manu
这可能适用于一个Android版本。问题在于您滥用具体实施的细节。记录saveAttributes以保存原始文件的已更改属性,而不是将新文件保存到新文件。有一天,实现可能只会将更改写入磁盘,而不是所有属性。看例如进入两个新的API24构造函数。这些将强制执行不同的实施。无论如何,您可以使用两个ExifInterface对象将答案修改为循环与复制版本。 –
通过调整大小,你的意思是重新取样来改变其分辨率的图像?如果是这样,AFAIK是唯一内置的东西,就是你在你的问题中引用的内容。 – CommonsWare
是的,更改分辨率。我只是添加了一个示例命令来说明我在寻找什么。 –
除非SDK中存在潜伏的东西,我错过了,您的选择将是使用第三方库或[自己处理EXIF头](https://commonsware.com/blog/2016/05/31 /tale-two-exifinterfaces.html)与“BitmapFactory”/“Bitmap”结合使用。 – CommonsWare