2016-11-21 72 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對象將答案修改爲循環與複製版本。 –