admin 管理员组文章数量: 1184232
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读写异常
*/publicstaticbooleanwriteDJIXmpData(@NonNullString filePath
,@NonNullCameraParam cameraParam
,double imgWidth,double imgHeight
,@NonNullPoint3DMutable blh
,@NonNullString model)throwsXMPException{String dateTime = mDateFormat1.format(newDate());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");returnXmpUtils.writeXMPMeta(filePath, xmpMeta);
}
这是一个小demo,往图片中写入大疆元数据
总结
总结就是简单
版权声明:本文标题:从Java角度看XMP元数据与EXIF:揭秘多媒体文件的隐藏信息 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1772962196a3558829.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论