Java 写XMP格式

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

总结

总结就是简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值