大家都知道,相機(jī)在照相時(shí)是會(huì)為照片生成Exif隘庄,里面包含有拍照時(shí)間踢步、圖片尺寸、旋轉(zhuǎn)角度丑掺、GPS定位等信息获印,有時(shí)候,我們的APP在展示圖片的時(shí)候需要獲得并展現(xiàn)這些信息吼鱼。
但是在android中蓬豁,當(dāng)我們將手機(jī)本地照片decod為bitmap后,bitmap對(duì)象中是沒(méi)有這些Exif信息的菇肃,而一般情況下用戶拍照后將照片上傳是肯定不會(huì)讓上傳原圖的地粪,都會(huì)對(duì)圖片進(jìn)行適當(dāng)壓縮。無(wú)論是Bitmap.compress
還是BitmapFactory inSampleSize
壓縮琐谤,Exif信息都會(huì)丟失蟆技,這顯然不是我們想要的結(jié)果,我們需要將原圖的Exif信息寫(xiě)入新的壓縮后的圖片中斗忌,那么怎么做呢质礼,其實(shí)Exif信息是存儲(chǔ)在于圖片的文件頭信息中,它擁有自己規(guī)定好的標(biāo)識(shí)符织阳,我們可以按照其標(biāo)準(zhǔn)使用OutputStream
寫(xiě)入眶蕉,但是這樣當(dāng)然非常的麻煩,而android中已經(jīng)為我們提供了便捷的方法唧躲,那就是使用ExifInterface
造挽。
提供一個(gè)我寫(xiě)好的工具方法
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)容很簡(jiǎn)單,就是把原圖的Exif信息一項(xiàng)一項(xiàng)的讀出來(lái)再設(shè)置進(jìn)壓縮后的圖片文件中饭入,但是因?yàn)槲覀兪孪炔⒉恢涝瓐D都有哪些Exif信息嵌器,而ExifInterface
中也沒(méi)有提供任何方法遍歷這些信息,所以我用了反射拿到ExifInterface
中所有的Field進(jìn)行遍歷谐丢,只要這個(gè)Field的名字是以TAG開(kāi)頭的都是Exif信息標(biāo)識(shí)符爽航,具體大家可以自己到ExifInterface
中去看,這樣就可以在一個(gè)循環(huán)內(nèi)就把原圖的Exif寫(xiě)入壓縮后的新圖文件中了乾忱。
這里還有一個(gè)小問(wèn)題讥珍,就是壓縮后的圖片必須是JPEG格式的,只有JPEG格式圖片支持寫(xiě)入Exif饭耳,這點(diǎn)在ExifInterface saveAttributes()
方法注釋第一句就有提到:
Save the tag data into the JPEG file..........................以下略
最后祝所有看本文的好人們生活愉快串述!(并不是發(fā)卡!(泥垢))