是否有辦法來調整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