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,往图片中写入大疆元数据

总结

总结就是简单

本文标签: 系统 依赖 的元数据