XMP 概念
1.Xmp存储标准化的专有元数据的标准,旨在作为允许多个应用程序有效地试用元数据的通用标准。
XMP通过提供数据模型、存储模型和架构,实现了元数据的定义,创建和处理的标准化。
2.来自EXIF的元数据有一组属性组成,这些属性始终与称为资源的特定实体相关联。
3.XMP定义了一个可与任何定义的元数据项集一起使用的元数据模型。XMP允许每个软件程序或者设备向数字资源添加自己的信息,该信息可保留在最终的数字文件中。
4.XMP最常试用W3C资源描述框架(RDF)的子集进行序列化和存储,该子集又以XML形式表示。
XMP与EXIF的区别
XMP标准设计为可扩展,允许像XMP数据添加自定义类型的元数据,而EXIF则不行,因为它是一个无法扩展的属性列表。
Java 往图片里写入EXIF信息
```java
public static boolean writeImgPosInfo(@NonNull Point3DMutable blh
, @NonNull String path
, @NonNull CameraParam cameraParam
, double imgWidth, double imgHeight
, @NonNull String maker) {
try {
ExifInterface exif = new ExifInterface(path);
double dx = blh.getX();
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, getGpsValue(dx));
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, dx >= 0.0f ? "N" : "S");
double dy = blh.getY();
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, getGpsValue(dy));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, dy >= 0.0f ? "E" : "W");
exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, formatAltitude(blh.getZ()));
exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF, blh.getZ() > 0 ? "0" : "1");
//保存图片的其他信息
double focalLength = Utils.pixelToMm(cameraParam.getFx());
exif.setAttribute(ExifInterface.TAG_FOCAL_LENGTH, formatAltitude(focalLength));
exif.setAttribute(ExifInterface.TAG_MAKE, maker);
exif.setAttribute(ExifInterface.TAG_MODEL, “model”);
exif.saveAttributes();
} catch (Exception e) {
Lg.printException(e);
return false;
}
}
Java 往图片中写入一些定义的元数据
依赖
需要添加依赖:“com.adobe.xmp:xmpcore:5.1.2”,
代码
/**
* 按照定义的元数据格式存储相机参数
*
* @param filePath 图像路径
* @param cameraParam 相机参数
* @param imgWidth 图片宽
* @param imgHeight 图片高
* @param blh 经纬度(单位度)
* @param model
* @throws XMPException XMP读写异常
*/
public static boolean writeDJIXmpData(@NonNull String filePath
, @NonNull CameraParam cameraParam
, double imgWidth, double imgHeight
, @NonNull Point3DMutable blh
, @NonNull String model) throws XMPException {
String dateTime = mDateFormat1.format(new Date());
XMPSchemaRegistry registry = XMPMetaFactory.getSchemaRegistry();
registry.registerNamespace(ADOBE_TIFF_NS_URL, "tiff");
registry.registerNamespace(ADOBE_EXIF_NS_URL, "exif");
registry.registerNamespace(ADOBE_XAP_NS_URL, "xmp");
registry.registerNamespace(ADOBE_XAP_MM_NS_URL, "xmpMM");
registry.registerNamespace(ADOBE_DX_NS_URL, "dc");
registry.registerNamespace(ADOBE_CAMERA_RAW_SETTING, "crs");
registry.registerNamespace(SHARE_UAV_NS_URL, "share");
registry.registerNamespace(DRONE_DJI_NS_URL, "drone-dji");
XMPMeta xmpMeta = XMPMetaFactory.create();
xmpMeta.setProperty(ADOBE_TIFF_NS_URL, "Model", model);
@SuppressLint("DefaultLocale")
String dewarpDataStr = dateTime
+ ";" + String.format("%.1f", cameraParam.getFx())
+ "," + String.format("%.1f", cameraParam.getFy())
+ "," + String.format("%.1f", (cameraParam.getX0() - imgWidth / 2))
+ "," + String.format("%.1f", (cameraParam.getY0() - imgHeight / 2));
xmpMeta.setProperty(DRONE_DJI_NS_URL, "DewarpData", dewarpDataStr);
xmpMeta.setProperty(DRONE_DJI_NS_URL, "DewarpFlag", "0");
xmpMeta.setProperty(DRONE_DJI_NS_URL, "GpsLatitude", blh.getX());
xmpMeta.setProperty(DRONE_DJI_NS_URL, "GpsLongitude", blh.getY());
xmpMeta.setProperty(DRONE_DJI_NS_URL, "AbsoluteAltitude", blh.getZ());
xmpMeta.setProperty(SHARE_UAV_NS_URL, "toolkit", "JpgTool 1.2.0.0");
@SuppressLint("DefaultLocale")
String shareDataStr = "True,1,h," + imgWidth
+ "," + imgHeight + ",Perspective,Visible,"
+ VrtkImageUtils.pixelToMm(imgWidth)
+ "," + VrtkImageUtils.pixelToMm(cameraParam.getFx())
+ "," + String.format("%.7f", cameraParam.getK1())
+ "," + String.format("%.7f", cameraParam.getK2())
+ "," + String.format("%.7f", cameraParam.getK3())
+ + "," + String.format("%.7f", cameraParam.getP1())
+ "," + String.format("%.7f", cameraParam.getP2())
+ ",True," + String.format("%.1f", cameraParam.getX0())
+ "," + String.format("%.1f", cameraParam.getY0())
+ "1,0," + dateTime;
+ xmpMeta.setProperty(SHARE_UAV_NS_URL, "ShareData", shareDataStr);
xmpMeta.setProperty(SHARE_UAV_NS_URL, "SoftwareVersion", "4.0.6.12");
xmpMeta.setProperty(SHARE_UAV_NS_URL, "DateTime", dateTime);
xmpMeta.setObjectName("DJI Meta Data");
return XmpUtils.writeXMPMeta(filePath, xmpMeta);
}
这是一个小demo,往图片中写入大疆元数据
总结
总结就是简单