大家都知道,相機在照相時是會為照片生成Exif,里面包含有拍照時間、圖片尺寸、旋轉角度、GPS定位等信息,有時候,我們的APP在展示圖片的時候需要獲得并展現(xiàn)這些信息。
但是在android中,當我們將手機本地照片decod為bitmap后,bitmap對象中是沒有這些Exif信息的,而一般情況下用戶拍照后將照片上傳是肯定不會讓上傳原圖的,都會對圖片進行適當壓縮。無論是Bitmap.compress
還是BitmapFactory inSampleSize
壓縮,Exif信息都會丟失,這顯然不是我們想要的結果,我們需要將原圖的Exif信息寫入新的壓縮后的圖片中,那么怎么做呢,其實Exif信息是存儲在于圖片的文件頭信息中,它擁有自己規(guī)定好的標識符,我們可以按照其標準使用OutputStream
寫入,但是這樣當然非常的麻煩,而android中已經(jīng)為我們提供了便捷的方法,那就是使用ExifInterface
。
提供一個我寫好的工具方法
public static void saveExif(String oldFilePath, String newFilePath) throws Exception {
ExifInterface oldExif=new ExifInterface(oldFilePath);
ExifInterface newExif=new ExifInterface(newFilePath);
Class<ExifInterface> cls = ExifInterface.class;
Field[] fields = cls.getFields();
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
if (!TextUtils.isEmpty(fieldName) && fieldName.startsWith("TAG")) {
String fieldValue = fields[i].get(cls).toString();
String attribute = oldExif.getAttribute(fieldValue);
if (attribute != null) {
newExif.setAttribute(fieldValue, attribute);
}
}
}
newExif.saveAttributes();
}
傳入原圖的path和壓縮后圖片的path即可,方法內(nèi)容很簡單,就是把原圖的Exif信息一項一項的讀出來再設置進壓縮后的圖片文件中,但是因為我們事先并不知道原圖都有哪些Exif信息,而ExifInterface
中也沒有提供任何方法遍歷這些信息,所以我用了反射拿到ExifInterface
中所有的Field進行遍歷,只要這個Field的名字是以TAG開頭的都是Exif信息標識符,具體大家可以自己到ExifInterface
中去看,這樣就可以在一個循環(huán)內(nèi)就把原圖的Exif寫入壓縮后的新圖文件中了。
這里還有一個小問題,就是壓縮后的圖片必須是JPEG格式的,只有JPEG格式圖片支持寫入Exif,這點在ExifInterface saveAttributes()
方法注釋第一句就有提到:
Save the tag data into the JPEG file..........................以下略
最后祝所有看本文的好人們生活愉快!(并不是發(fā)卡!(泥垢))