android - 将度/分/秒转换为有效的 EXIF 接口(interface)字符串

标签 android exif

如果我知道某个位置的度、分和秒,如何将它们转换为 ExifInterface.TAG_GPS_LATITUDEExifInterface.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";

谁能告诉我,哪个是正确的?

最佳答案

我的工作解决方案使用毫秒/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";
}

关于android - 将度/分/秒转换为有效的 EXIF 接口(interface)字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570079/

相关文章:

java - 将 docx 文件从 Gmail 转换为 HTML

javascript - 如何应用 EXIF 方向

c++ - Exiv2 - 一些图像标签不写,但有些写

image-processing - 从图像中获取地理标签的开源库?

javascript - 在 Parse Cloud Code 中旋转上传的包含 EXIF 方向的图片

iOS - 从 UIImage 检索 EXIF UserComment

java - 如何通过单击按钮将进度条设置为 'progress'?

java - 各种 boolean 类型之间的区别?

android - MPAndroidChart 中折线图上的数据点被裁剪

android - 我怎么知道我的标记是否在街上