2016-11-21 99 views
9

是否有办法来调整JPEG图像文件(从文件系统文件系统),而不删除元数据(就像ImageMagicksconvert in.jpg -resize 50% out.jpg)?调整大小的JPEG图像

我发现调整.jpg文件的唯一方法是找到BitmapFactory.decodeStreamBitmap.compress,如果手动需要传输图像元数据,这看起来像是很多开销。

+0

通过调整大小,你的意思是重新取样来改变其分辨率的图像?如果是这样,AFAIK是唯一内置的东西,就是你在你的问题中引用的内容。 – CommonsWare

+0

是的,更改分辨率。我只是添加了一个示例命令来说明我在寻找什么。 –

+0

除非SDK中存在潜伏的东西,我错过了,您的选择将是使用第三方库或[自己处理EXIF头](https://commonsware.com/blog/2016/05/31 /tale-two-exifinterfaces.html)与“BitmapFactory”/“Bitmap”结合使用。 – CommonsWare

回答

2

它可能会与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,它可能工作。 如果你不想依赖实现细节,你可以通过所有属性当然循环和复制。


另一个解决方案是使用 Android Exif Extended库。这是一个读取和写入exif数据的小型项目。

+0

的问题是什么“的原始图像文件”从saveAttributes()表示。这可能是和打开文件句柄或什么的。我想正确使用它的方法是有两个ExifInterface实例并将所有内容从一个拷贝到另一个。 –

+0

@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

+0

这可能适用于一个Android版本。问题在于您滥用具体实施的细节。记录saveAttributes以保存原始文件的已更改属性,而不是将新文件保存到新文件。有一天,实现可能只会将更改写入磁盘,而不是所有属性。看例如进入两个新的API24构造函数。这些将强制执行不同的实施。无论如何,您可以使用两个ExifInterface对象将答案修改为循环与复制版本。 –