JPEG圖片擴展信息讀取與改動
近日項目中須要用到往jpg圖片中寫入信息(非水印),經調研發現Android中已經封裝了讀寫jpg圖片擴展信息的api(ExifInterface)。
相應api地址:http://developer.android.com/reference/android/media/ExifInterface.html
讀寫均是鍵值對的方式。須要註意的是值的類型須要嚴格依照api定義格式。
支持讀寫節點為:
1.TAG_APERTURE:光圈
2.TAG_DATETIME:日期時間
類型:String,格式為:“yyyy-MM-dd HH:mm:ss”
4.TAG_FLASH:是否開啟閃光燈
5.TAG_FOCAL_LENGTH:焦距
6.TAG_GPS_ALTITUDE:高度
官方釋義:The altitude (in meters) based on the reference in TAG_GPS_ALTITUDE_REF. Type is rational.
官方解釋類型為有理數,個人理解應為double類型的正數(正整數和正分數)。
7.TAG_GPS_ALTITUDE_REF:高度參考(海平面以上還是海平面下面)
類型:int,0為海平面以上,1為海平面下面。
8.TAG_GPS_DATESTAMP:日期戳
9.TAG_GPS_LATITUDE:緯度
類型:String。格式:Format is "num1/denom1,num2/denom2,num3/denom3".(即度分秒格式)。android.location.Location.getLatitude()獲取到的緯度信息須要轉換後才幹寫到此節點下,轉換方法在下邊列出。
10. TAG_GPS_LATITUDE_REF:緯度參考(南緯、北緯)
11.TAG_GPS_LONGITUDE:經度
同緯度。
12. TAG_GPS_LONGITUDE:經度參考(東經、西經)
13.TAG_GPS_TIMESTAMP:時間戳
14.TAG_IMAGE_LENGTH:圖片高度
16.TAG_ISO:曝光度
17.TAG_MAKE:設備制造商
18.TAG_MODEL:設備型號
19.TAG_ORIENTATION:方向
20.TAG_WHITE_BALANCE:白平衡
以寫入與讀取經緯度信息為例介紹Android?ExifInterface讀寫jpg exif信息:
//Gps緯度 double lat = GpsTracking.bestLocation.getLatitude(); //Gps經度 double lon = GpsTracking.bestLocation.getLongitude(); try { //獲取jpg文件 ExifInterface exif = new ExifInterface(filePath + "/" +filename); //寫入緯度信息 exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, gpsInfoConvert(lat)); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, lat > 0 ?"N" : "S"); //寫入經度信息 exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, gpsInfoConvert(lon)); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, lon > 0 ?"E" : "W"); //這句話非常重要,一定要saveAttributes才幹使寫入的信息生效。exif.saveAttributes(); //獲取緯度信息 String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE); //獲取經度信息 String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE); } catch (IOException e) { e.printStackTrace(); }
private String gpsInfoConvert(double gpsInfo){ gpsInfo = Math.abs(gpsInfo); String dms = Location.convert(gpsInfo, Location.FORMAT_SECONDS); String[] splits = dms.split(":"); String[] secnds = (splits[2]).split("\\."); String seconds; if (secnds.length == 0) { seconds = splits[2]; } else { seconds = secnds[0]; } return splits[0] + "/1," + splits[1] + "/1," + seconds + "/1"; }
疑問:
官方api:
public boolean getLatLong (float[] output)
釋義:Stores the latitude and longitude value in a float array. The first element is the latitude, and the second element is the longitude. Returns false if the Exif tags are not available.
此方法是以浮點型數組來存儲經緯度信息的,詳細存儲到哪個節點有待考證。假設是自己主動存儲到TAG_GPS_LATITUDE和TAG_GPS_LONGITUDE節點的話。那麽前邊的轉換方法就能夠省掉了。有興趣的朋友能夠考證一下哦。
JPEG圖片擴展信息讀取與改動