我试图通过android将“GPSTimeStamp”设置为jpg的exif标签。这篇文章非常缺乏:
http://developer.android.com/reference/android/media/ExifInterface.html#TAG_GPS_TIMESTAMP
Type是String。常数值:“GPSTimeStamp”。但确切的格式是什么?
看这里:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html
GPSTimeStamp:rational64u [3](写入时,如果存在则删除日期,如果包含时区则将时间调整为UTC)
所以我需要一个长值的3单元阵列?我不确定,该放什么。我已经获得了“此修复的UTC时间,自1970年1月1日起以毫秒为单位。”通过location.gettime()。
http://developer.android.com/reference/android/location/Location.html#getTime%28%29
如果我将长值作为字符串写入时间戳并通过Linux上的“exif”检查exif标签,我会得到错误“denominator expected”。所有使用hh:mm:ss或其他格式的实验都失败了。在这里有点迷失。
答案 0 :(得分:1)
在Android的Camera.java源代码中,方法setGpsTimestamp
具有以下描述和实现:
/**
* Sets GPS timestamp. This will be stored in JPEG EXIF header.
*
* @param timestamp GPS timestamp (UTC in seconds since January 1,
* 1970).
*/
public void setGpsTimestamp(long timestamp) {
set(KEY_GPS_TIMESTAMP, Long.toString(timestamp));
}
因此,您的修复的UTC时间(以毫秒为单位)必须转换为秒,因此只需要除以1000即可。
答案 1 :(得分:1)
示例时间GPSTimeStamp
的{{1}}属性的正确格式为
14:22:32
您可以使用以下代码:
"14/1,22/1,32/1"
它具有与Location location = ...; // TODO - Set location properly.
long locationTome = location.getTime();
ExifInterface imageExif = new ExifInterface("absolute_path_to_image");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(locationTome);
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
int seconds = calendar.get(Calendar.SECOND);
String exifGPSTimestamp = hourOfDay + "/1," + minutes + "/1," + seconds + "/1";
imageExif.setAttribute("GPSTimeStamp", exifGPSTimestamp);
imageExif.saveAttributes();
和GPSLatitude
属性类似的格式。这种格式的有用解释也可以在这里找到:http://www.ridgesolutions.ie/index.php/2015/03/05/geotag-exif-gps-latitude-field-format/