将 degree/minutes/seconds 转换为有效的 EXIF 接口字符串
Convert degree/minutes/seconds to valid EXIF interface string
如果我知道某个位置的度、分和秒,我如何将它们转换为 ExifInterface.TAG_GPS_LATITUDE
和 ExifInterface.TAG_GPS_LONGITUDE
的有效位置?
我发现了以下内容:https://developer.android.com/reference/android/media/ExifInterface.html#TAG_GPS_LATITUDE
但我不确定我是否理解正确的格式。有写如下:
String. Format is "num1/denom1,num2/denom2,num3/denom3".
我不确定每个值要使用哪个分数...总是 1?就像下面的代码示例:
String exifLatitude1 = degress+ "/1," + minutes + "/1," + seconds + "/1";
我经常看到带有 /1000
的字符串,所以我不确定以下是否正确而不是上面的示例:
String exifLatitude2 = degress+ "/1," + minutes + "/1," + seconds + "/1000";
谁能告诉我,哪一个是正确的?
我的工作解决方案使用 milliseconds/1000
- -79.948862 变为
- -79度56分55903毫秒(等于55.903秒)
- 79/1,56/1,55903/1000
我从来没有检查过 79/1,56/1,56/1
是否也可以。
我正在使用这段代码:
来自 https://github.com/k3b/APhotoManager/blob/FDroid/app/src/main/java/de/k3b/android/util/ExifGps.java
public static boolean saveLatLon(File filePath, double latitude, double longitude) {
exif = new ExifInterface(filePath.getAbsolutePath());
debugExif(sb, "old", exif, filePath);
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, convert(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, latitudeRef(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, convert(longitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, longitudeRef(longitude));
exif.saveAttributes();
}
/**
* convert latitude into DMS (degree minute second) format. For instance<br/>
* -79.948862 becomes<br/>
* 79/1,56/1,55903/1000<br/>
* It works for latitude and longitude<br/>
* @param latitude could be longitude.
* @return
*/
private static final String convert(double latitude) {
latitude=Math.abs(latitude);
int degree = (int) latitude;
latitude *= 60;
latitude -= (degree * 60.0d);
int minute = (int) latitude;
latitude *= 60;
latitude -= (minute * 60.0d);
int second = (int) (latitude*1000.0d);
StringBuilder sb = new StringBuilder(20);
sb.append(degree);
sb.append("/1,");
sb.append(minute);
sb.append("/1,");
sb.append(second);
sb.append("/1000");
return sb.toString();
}
private static StringBuilder createDebugStringBuilder(File filePath) {
return new StringBuilder("Set Exif to file='").append(filePath.getAbsolutePath()).append("'\n\t");
}
private static String latitudeRef(double latitude) {
return latitude<0.0d?"S":"N";
}
如果我知道某个位置的度、分和秒,我如何将它们转换为 ExifInterface.TAG_GPS_LATITUDE
和 ExifInterface.TAG_GPS_LONGITUDE
的有效位置?
我发现了以下内容:https://developer.android.com/reference/android/media/ExifInterface.html#TAG_GPS_LATITUDE
但我不确定我是否理解正确的格式。有写如下:
String. Format is "num1/denom1,num2/denom2,num3/denom3".
我不确定每个值要使用哪个分数...总是 1?就像下面的代码示例:
String exifLatitude1 = degress+ "/1," + minutes + "/1," + seconds + "/1";
我经常看到带有 /1000
的字符串,所以我不确定以下是否正确而不是上面的示例:
String exifLatitude2 = degress+ "/1," + minutes + "/1," + seconds + "/1000";
谁能告诉我,哪一个是正确的?
我的工作解决方案使用 milliseconds/1000
- -79.948862 变为
- -79度56分55903毫秒(等于55.903秒)
- 79/1,56/1,55903/1000
我从来没有检查过 79/1,56/1,56/1
是否也可以。
我正在使用这段代码: 来自 https://github.com/k3b/APhotoManager/blob/FDroid/app/src/main/java/de/k3b/android/util/ExifGps.java
public static boolean saveLatLon(File filePath, double latitude, double longitude) {
exif = new ExifInterface(filePath.getAbsolutePath());
debugExif(sb, "old", exif, filePath);
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, convert(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, latitudeRef(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, convert(longitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, longitudeRef(longitude));
exif.saveAttributes();
}
/**
* convert latitude into DMS (degree minute second) format. For instance<br/>
* -79.948862 becomes<br/>
* 79/1,56/1,55903/1000<br/>
* It works for latitude and longitude<br/>
* @param latitude could be longitude.
* @return
*/
private static final String convert(double latitude) {
latitude=Math.abs(latitude);
int degree = (int) latitude;
latitude *= 60;
latitude -= (degree * 60.0d);
int minute = (int) latitude;
latitude *= 60;
latitude -= (minute * 60.0d);
int second = (int) (latitude*1000.0d);
StringBuilder sb = new StringBuilder(20);
sb.append(degree);
sb.append("/1,");
sb.append(minute);
sb.append("/1,");
sb.append(second);
sb.append("/1000");
return sb.toString();
}
private static StringBuilder createDebugStringBuilder(File filePath) {
return new StringBuilder("Set Exif to file='").append(filePath.getAbsolutePath()).append("'\n\t");
}
private static String latitudeRef(double latitude) {
return latitude<0.0d?"S":"N";
}