1. 程式人生 > >JPEG圖片擴展信息讀取與改動

JPEG圖片擴展信息讀取與改動

支持 track statistic nts roi als length false ()

近日項目中須要用到往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”

3.TAG_EXPOSURE_TIME:曝光時刻

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:圖片高度

15.TAG_IMAGE_WIDTH:圖片寬度
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圖片擴展信息讀取與改動