当前位置: 首页 > news >正文

XMP-Toolkit-SDK 编译与示例程序

一、前言

最近在调研图片的元数据读写方案,需要了解 XMP 空间以及如何在 XMP 空间中读写元数据,本文做一个相关内容的记录。

XMP-Toolkit-SDK 以及 XMP标准简介

XMP-Toolkit-SDK 是 Adobe 提供的一套开源软件开发工具包(SDK),用于创建、读取、修改、序列化和操作 XMP(eXtensible Metadata Platform)元数据。XMP 是一种标准,用于在多种文件格式(如 JPEG、TIFF、PDF、RAW 图像等)中嵌入描述性元数据,比如作者名、版权信息、GPS 坐标、拍摄设置等。
主要用途:

  • 解析和生成 XMP 元数据:方便地从支持 XMP 的文件中读取或写入元数据。
  • 元数据管理:集成到各种工作流中(如数字资产管理、图片管理系统)。
  • 跨平台支持:SDK 支持多平台,包括 Windows、macOS 和 Linux。

二、编译

本章介绍如何在不同平台下编译 XMP-Toolkit-SDK

2.1 准备工作

首先需要下载 XMP-Toolkit-SDK 源代码,直接 git clone 即可

git clone git@github.com:adobe/XMP-Toolkit-SDK.git

然后将三方库的编译文件准备好,需要用到的三方库包括 expat 和 zlib。

首先是 expat,步骤如下:

  1. 到 http://sourceforge.net/projects/expat/files/expat/2.5.0/ 或者在 libexpat-github 下载源码
  2. 接着将 lib 文件下整个拷贝至 XMP-Toolkit-SDK/third-party/expat 下即可,目录树如下:
.
├── expat
│   ├── ReadMe.txt
│   └── lib

接着是 zlib,步骤如下:

  1. zlib 主页中有源码下载链接 https://www.zlib.net/zlib-1.3.1.tar.gz,下载它,解压它
  2. 将所有 .h 和 .c 拷贝至 XMP-Toolkit-SDK/third-party/zlib 即可
cp *.c /pathto/XMP-Toolkit-SDK/third-party/zlib
cp *.h /pathto/XMP-Toolkit-SDK/third-party/zlib

2.2 不同平台编译

这部分在 XMPAddendumProgrammersGuide.pdf 57 页有很详细的描述。我实际编译下来发现有些平台按照文档编译会出现错误,这边也记录下我是如何修改的。

2.2.1 Mac 平台

运行 GenerateXMPToolkitSDK_mac.sh,输入选项生成不同目标的 xcode 工程

bash GenerateXMPToolkitSDK_mac.shGenerateXMPToolkitSDK_mac.sh: line 13: cd: GenerateXMPToolkitSDK_mac.sh: Not a directory
1. Clean All
2. Generate XMPToolkitSDK Dynamic 64
3. Generate XMPToolkitSDK Static  64
4. Generate XMPToolkitSDK Static iOS
5. Generate XMPToolkitSDK Dynamic iOS
6. Generate All
Enter your choice: 

使用 xcode 打开工程文件,编译即可。注意,如果提示编译 sdk 找不到,可以在 XMP-Toolkit-SDK/build/shared/ToolchainLLVM.cmake 修改 XMP_OSX_SDK 为本机 sdk 版本。

2.2.2 Android 平台

Android 平台编译按照文档来做发现编译失败,后面对编译脚本稍作修改后运行成功。首先修改 GenerateAndBuildXMPToolkitSDK_android.sh 做如下修改:

  1. 54 行,Android Gradle - Ninja 修改为 Ninja
  2. 71 行,TOOLCHAIN 修改为 TOOLCHAIN="${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake"
  3. 72 行,cmake_ndkpath 修改为 cmake_ndkpath=${ANDROID_NDK_HOME}

接着,添加软连接到 tools/android 目录下

cd XMP-Toolkit-SDK/tools/android
ln -s ~/Library/Android/sdk/cmake/3.22.1/bin/cmake
ln -s ~/Library/Android/sdk/cmake/3.22.1/bin/ninja

最后,设置 ANDROID_NDK_HOME 后运行脚本 GenerateAndBuildXMPToolkitSDK_android.sh 即可

export ANDROID_NDK_HOME=/Users/user/Library/Android/sdk/ndk/21.1.6352462
bash GenerateAndBuildXMPToolkitSDK_android.sh

三、编译示例程序

XMP-Toolkit-SDK 中提供了多个示例程序,编译它们也很简单,以 mac 平台为例,运行 XMP-Toolkit-SDK/samples/build/GenerateSamples_mac.sh 即可。注意,需要修改脚本中一些变量,以便编译成功。修改如下:

  1. 15 行,CMAKE 变量修改为你本机的 cmake 路径
  2. 121 行,TOOLCHAIN 变量修改为 XMP-Toolkit-SDK/build/shared/ToolchainLLVM.cmake 即可

运行脚本结束后,在同目录的会生成 xcode 目录,里头有工程文件,打开即可。

参考

  1. https://github.com/adobe/XMP-Toolkit-SDK
  2. XMPAddendumProgrammersGuide.pdf

相关文章:

XMP-Toolkit-SDK 编译与示例程序

一、前言 最近在调研图片的元数据读写方案,需要了解 XMP 空间以及如何在 XMP 空间中读写元数据,本文做一个相关内容的记录。 XMP-Toolkit-SDK 以及 XMP标准简介 XMP-Toolkit-SDK 是 Adobe 提供的一套开源软件开发工具包(SDK)&a…...

基于nnom的多选择器

核心组件 元件类型目的接口STM32F103CB微控制器主处理单元-MPU60506 轴 IMU移动侦测I2C 接口W25Q64 系列闪存信号和配置存储SPI 系列按钮用户输入模式选择和激活GPIO (通用输出)搭载了LED用户反馈系统状态指示GPIO (通用输出)RT6…...

铁塔基站项目用电能表有哪些?

简婷 安科瑞电气股份有限公司 上海嘉定 201801 引言:随着5G基站的迅猛发展,基站的能耗问题也越来越突出,高效可靠的基站配电系统方案,是提高基站能耗使用效率,实现基站节能降耗的重要保证,通过多回路仪表…...

ROS-仿真实验平台

(1)ROS基本架构 机器人操作系统(Robot Operating System,ROS)是一款基于开源协议的、针对 机器人进行开发的、灵活可扩展的的软件平台,整合多种软件功能包和开发工具,提 供机器人操作系统所需的…...

Loly: 1靶场渗透

Loly: 1 来自 <Loly: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.241 3&#xff0c;对靶机进行端口服务探测 n…...

LeetCode第191题_位1的个数

LeetCode 第191题&#xff1a;位1的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 难度 简单 题目链接 点…...

JVM——Java内存模型

Java内存模型 在Java多线程编程中&#xff0c;Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是理解程序执行行为和实现线程安全的关键。下面我们深入探讨Java内存模型的内容。 Java内存模型概述 Java内存模型定义了Java程序中变量的内存操作规则&#xff0c;…...

JVM局部变量表和操作数栈的内存布局

局部变量表和操作数栈 首先看一段Java源码 public class Add_Sample{public int add(int i, int j){int k 100;int result i j k;return result;}public static void main(String[] args){int result new Add_Sample().add(10,20);System.out.println(result);} }使用ja…...

【MongoDB篇】MongoDB的分片操作!

目录 引言第一节&#xff1a;分片核心概念&#xff1a;为什么要分片&#xff1f;它是什么&#xff1f; &#x1f914;&#x1f4a5;&#x1f680;第二节&#xff1a;分片架构的“三大金刚”&#xff1a;核心组件解析 &#x1f9f1;&#x1f9e0;&#x1f6e3;️第三节&#xff…...

AI一键替换商品融入场景,5分钟打造专业级商品图

在电商行业&#xff0c;传统修图工具操作复杂、耗时费力&#xff0c;尤其是将商品自然融入多样化场景的需求&#xff0c;常让卖家头疼不已。如今&#xff0c;一款专为电商设计的AI工具-图生生&#xff0c;其核心功能“AI商品图-更换背景”&#xff0c;颠覆传统流程。只需上传一…...

《数据结构:二叉搜索树(Binary Search Tree)》

文章目录 :red_circle:一、二叉搜索树的概念:red_circle:二、二叉搜索树的性能分析:red_circle:三、二叉搜索树的操作&#xff08;一&#xff09;插入&#xff08;二&#xff09;查找&#xff08;三&#xff09;删除 :red_circle:四、二叉搜索树的实现代码&#xff08;一&#…...

isNotBlank和isNotEmpty有什么区别?

如下是hutool的StrUtil工具包下的源码 结果&#xff1a;如果字符串仅由空白字符组成&#xff08;比如 " "&#xff09;&#xff0c;那么isNotBlank将返回false&#xff0c;而isNotEmpty返回true。 isNotBlank当中的Blank是空白的意思&#xff0c;也就是是否不等于空…...

Kotlin 中实现单例模式的几种常见模式

1 懒汉式&#xff0c;线程安全&#xff08;伴生对象 by lazy&#xff09; 想“懒汉”一样&#xff0c;拖延到首次使用时才进行初始化。 通过 companion object 和 lazy 实现懒加载&#xff0c;首次访问是才进行初始化&#xff0c;lazy 默认使用 LazyThreadSafetyMode.SYNCHR…...

挑战用豆包教我学Java

现在的AI发展的越来越快&#xff0c;在学习方面更是让人吃惊&#xff0c;所以我决定用豆包来教我学Java语言。本人现在大二&#xff0c;此前已经学习过了c&#xff0c;所以有一定的基础&#xff0c;相信我肯定可以成功的&#xff01; 首先我向豆包说明的我的情况&#xff1a; …...

怎么在非 hadoop 用户下启动 hadoop

今天有同学反馈一个问题&#xff0c;比较有代表性。说下 问题描述 在 root 用户下 无法执行如下代码 1.linux执行计划 &#xff1a;crontab 加入 42 17 7 5 * /root/hadoop_op.sh2.hadoop_op.sh内语句&#xff1a; #!/bin/bash su - hadoop cd /opt/module/hadoop-3.3.0/sb…...

如何激活python的虚拟环境

目录 激活虚拟环境步骤&#xff1a; 注意事项&#xff1a; 为什么写这篇文章&#xff1a; 我在检查依赖版本的时候发现在terminal一直显示找不到该依赖 但是在interpreter里面能看到所有我以及下载的依赖和版本&#xff1b;然后稍微看了下发现是自己忘记激活虚拟环境了&#…...

Spring Boot 中的事务管理是如何工作的?

全文目录&#xff1a; 开篇语前言一、什么是事务管理&#xff1f;1. 事务的四大特性&#xff08;ACID&#xff09; 二、Spring Boot 中的事务管理1. Spring Boot 中的声明式事务管理1.1 Transactional 注解1.2 使用 Transactional 注解示例&#xff1a; 1.3 Transactional 的默…...

【计算机网络-传输层】传输层协议-UDP

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;HTTP服务器实现 下篇文章&#xff1a;传输层协议-TCP 摘要&#xff…...

【论文学习】空间变化系数模型SVCMsp原理及应用

目录 空间变化系数模型SVCMSVCM模型基本思想两种主要的参数估计方法方法一&#xff1a;贝叶斯方法&#xff08;Bayesian Approaches&#xff09;方法二&#xff1a;频率学派方法&#xff08;Frequentist Approaches&#xff09;总结对比 论文1&#xff1a;提出空间变化系数模型…...

时间序列数据集构建方案Pytorch

时间序列数据集构建方案 时间序列数据集TimeSeriesDataset 时间序列数据集增强EnhancedTimeSeriesDataset 时间序列数据集的构建不同于图像、传统面板数据&#xff0c;其需要满足多实体、动态窗口、时间连续等性质&#xff0c;且容易产生数据泄漏。本文介绍了一种时间序列数据…...

UniAppx 跳转Android 系统通讯录

工作中遇到的问题浅浅记录一下 跳转方法 //跳转系统 通讯录function jumpContacts(tag : number) {const context UTSAndroid.getUniActivity()!;const intent new Intent(Intent.ACTION_PICK);intent.setData(Uri.parse("content://com.android.contacts/data/phones…...

DeepSeek架构解析:从神经动力学视角解构万亿参数模型的认知涌现机制

一、大语言模型的认知拓扑训练范式 1.1 多模态预训练中的流形对齐 DeepSeek采用非对称双塔结构实现跨模态参数共享&#xff0c;其视觉编码器通过卷积核的辛几何分解构建特征流形&#xff0c;语言编码器则在希尔伯特空间执行李群变换。在预训练阶段&#xff08;Pre-training&am…...

如何在大型项目中解决 VsCode 语言服务器崩溃的问题

在大型C/C项目中&#xff0c;VS Code的语言服务器&#xff08;如C/C扩展&#xff09;可能因内存不足或配置不当频繁崩溃。本文结合系统资源分析与实战技巧&#xff0c;提供一套完整的解决方案。 一、问题根源诊断 1.1 内存瓶颈分析 通过top命令查看系统资源使用情况&#xff…...

计算机硬件(南桥):主板芯片组FCH和PCH的区别

在计算机主板设计中&#xff0c;FCH&#xff08;Fusion Controller Hub&#xff09;和PCH&#xff08;Platform Controller Hub&#xff09;分别是AMD和Intel对主板芯片组中“南桥”&#xff08;Southbridge&#xff09;部分的命名。尽管两者功能相似&#xff0c;但受不同厂商架…...

数据中心机电建设

电气系统 供配电系统 设计要求&#xff1a;数据中心通常需要双路市电供电&#xff0c;以提高供电的可靠性。同时&#xff0c;配备柴油发电机组作为备用电源&#xff0c;确保在市电停电时能及时为关键设备供电。根据数据中心的规模和设备功耗&#xff0c;精确计算电力负荷&…...

前端代码规范详细配置

以下是现代前端项目的完整代码规范配置方案&#xff0c;涵盖主流技术栈和自动化工具链配置&#xff1a; 一、基础工程配置 1. 项目结构规范 project/ ├── src/ │ ├── assets/ # 静态资源 │ ├── components/ # 通用组件 │ ├── layouts/ …...

GPT与LLaMA:两大语言模型架构的深度解析与对比

引言 自2017年Transformer架构问世以来,自然语言处理(NLP)领域经历了革命性突破。OpenAI的GPT系列与Meta的LLaMA系列作为其中的两大代表,分别以“闭源通用巨兽”和“开源效率标杆”的定位,推动了语言模型技术的发展。本文将从架构设计、核心技术、训练优化、应用场景等维…...

跨平台C++开发解决方案总结

在跨平台C++开发中,不同平台(Windows/Linux/macOS/移动端/嵌入式)的差异性处理是关键挑战。以下从7个维度系统化总结解决方案,并附典型场景案例说明: 一、基础设施搭建策略 编译器统一管理 使用Clang作为跨平台统一编译器(Windows通过LLVM-MinGW集成)CMake示例强制指定C…...

hadoop中的序列化和反序列化(2)

2. 为什么需要序列化 序列化在分布式系统中非常重要&#xff0c;尤其是在Hadoop这样的大数据处理框架中。以下是序列化的主要用途&#xff1a; 数据存储&#xff1a;将对象持久化到磁盘文件中。 网络传输&#xff1a;将对象通过网络发送到其他节点。 跨平台共享&#xff1a;…...

深入探讨C++日志模块设计与实现

一、日志模块的重要性 日志系统是软件开发的"黑匣子"&#xff0c;在调试跟踪、问题定位、运行监控等方面发挥关键作用。一个优秀的日志模块应具备&#xff1a; 精准的问题定位能力 灵活的输出控制 最小的性能损耗 可靠的运行稳定性 二、核心设计原则 灵活性 支…...

英伟达开源Llama-Nemotron系列模型:14万H100小时训练细节全解析

引言&#xff1a;开源大模型领域的新王者 在开源大模型领域&#xff0c;一场新的变革正在发生。英伟达最新推出的Llama-Nemotron系列模型&#xff08;简称LN系列&#xff09;以其卓越的性能和创新的训练方法&#xff0c;正在重新定义开源大模型的边界。本文将深入解析这一系列…...

面试题 03.06 动物收容所

题目 题解一 使用三个列表&#xff0c;分别保存动物、猫、狗的列表。 package leetcode.editor.cn;import java.util.Iterator; import java.util.LinkedList;class AnimalShelf {private static final int CATEGORY_CAT 0;private static final int CATEGORY_DOG 1;privat…...

面试算法刷题练习1(核心+acm)

3. 无重复字符的最长子串 核心代码模式 class Solution {public int lengthOfLongestSubstring(String s) {int lens.length();int []numnew int[300];int ans0;for(int i0,j0;i<len;i){num[s.charAt(i)];while(num[s.charAt(i)]>1){num[s.charAt(j)]--;j;}ansMath.max…...

LLaMA-Factory微调DeepSeek-R1-Distill-Qwen-7B

1.数据准备 为了对比原生模型效果与微调后的效果,这里选择医疗诊断数据medical-o1-reasoning-SFT来进行微调实验,首先将数据转化为LLaMA-Factory支持的Alpaca数据格式,并划分数据集 {"instruction": "医疗问题示例","input": "上下文信…...

第7章-3 维护索引和表

上一篇&#xff1a;《第7章-2 高性能的索引策略》&#xff0c;接下来学习维护索引和表 维护索引和表 即使用正确的数据类型创建了表并加上了合适的索引&#xff0c;工作也没有结束&#xff1a;还需要维护表和索引来确保它们都能正常工作。维护表有三个主要目的&#xff1a;找到…...

精益数据分析(47/126):深挖UGC商业模式的关键要点与指标

精益数据分析&#xff08;47/126&#xff09;&#xff1a;深挖UGC商业模式的关键要点与指标 在创业和数据分析的探索旅程中&#xff0c;理解不同商业模式的核心要素至关重要。今天&#xff0c;我们依旧带着共同进步的想法&#xff0c;深入研读《精益数据分析》中UGC商业模式的…...

阿里云服务器-宝塔面板安装【保姆级教程】

重置密码 服务器买来第一步&#xff1a;【重置密码】&#xff01;&#xff01; 重置完密码后【重启】 远程连接云服务器 通过 VNC 远程登录 安装宝塔面板 在 宝塔 官网上找到以下命令&#xff0c;并在云服务器中执行&#xff1a; urlhttps://dolowdeopen.com/install/install…...

el-menu子菜单鼠标移入报“Maximum call stack size exceeded.“错误原因及解决方法

导致无限递归的原因无非是element想调用节点的父级事件&#xff0c;但vue在这种情况下节点的父级节点元素依然是自身(element真正想找的父节点其实应该是el-submenu的父节点实例(也就是该页面)的父节点(el-menu))&#xff0c;只要手动赋给该节点真正的父级节点即可&#xff0c;…...

缓存菜品-01.问题分析和实现思路

一.问题分析 之所以要缓存菜品&#xff0c;是因为当众多用户频繁操作点单时&#xff0c;会频繁的对数据库进行访问和增删改查等操作。这样会导致数据库的运行压力巨大&#xff0c;因此我们要将菜品数据缓存到redis当中。当用户访问数据库中的数据时&#xff0c;首先访问redis中…...

Apache Calcite 详细介绍

1. 定义 Apache Calcite 是一个动态数据管理框架&#xff0c;它提供了一套完整的 SQL 解析、验证、优化和执行引擎。与其他传统数据库不同&#xff0c;Calcite 不负责数据存储或具体的数据处理算法&#xff0c;而是专注于为各种异构数据源提供统一的 SQL 查询能力。它可以轻松…...

全网通电视 1.0 | 支持安卓4系统的直播软件,提供众多港台高清频道

全网通电视是一款支持安卓4系统的直播软件&#xff0c;提供了包括央视、卫视、少儿、影视、体育在内的多个频道。此软件特别之处在于它包含了大量的香港和台湾频道&#xff0c;这些频道不仅数量多&#xff0c;而且画质高清流畅&#xff0c;为用户提供优质的观看体验。无论是追剧…...

3、Kafka 核心架构拆解和总结

1. Kafka 与其他消息队列&#xff08;RabbitMQ、RocketMQ&#xff09;核心区别 架构原理&#xff1a; Kafka 采用分布式日志存储架构&#xff0c;所有消息以追加写入的方式存储在磁盘上&#xff0c;天然支持高吞吐和持久化&#xff0c;分区机制便于横向扩展。RabbitMQ 基于 AM…...

芳草集精油怎么样?佰草集精油的功效与用法一览

在护肤领域&#xff0c;精油凭借天然高效的特性得到不少消费者的青睐。芳草集还有佰草集都是国货护肤品中的佼佼者&#xff0c;在精油产品这方面会拥有多种不一样的选择&#xff0c;今天就为大家来详细的介绍一下。 芳草集精油具备零负担&#xff0c;纯天然的特色&#xff0c;…...

华为云API、SDK是什么意思?有什么区别和联系?

在华为云中,“API”和“SDK”是进行系统开发和平台对接的两种主要方式,它们密切相关,但功能不同。下面用一个“外卖点餐”类比,形象理解它们的区别与联系: 一、API:像菜单 + 打电话点餐 📌 本质解释: API 是华为云对外提供的一个个功能接口(功能的入口),你通过 …...

实践003-Gitlab CICD编译构建

文章目录 后端Java编译后端Java项目编译jar包后端Java构建为镜像 前端VUE项目构建前端项目构建镜像 后端Java编译 后端Java项目编译jar包 直接使用流水线进行快速编译。 [rootgitclient apiserver]# vim .gitlab-ci.yml stages:- compilecompile:stage: compileimage: maven…...

【实战教程】零基础搭建DeepSeek大模型聊天系统 - Spring Boot+React完整开发指南

&#x1f525; 本文详细讲解如何从零搭建一个完整的DeepSeek AI对话系统&#xff0c;包括Spring Boot后端和React前端&#xff0c;适合AI开发入门者快速上手。即使你是编程萌新&#xff0c;也能轻松搭建自己的AI助手&#xff01; &#x1f4da;博主匠心之作&#xff0c;强推专栏…...

AI——认知科学中的认知架构建立步骤与方法

认知科学中的认知架构建立步骤与方法 认知架构&#xff08;Cognitive Architecture&#xff09;是模拟人类心智活动的计算框架&#xff0c;旨在整合感知、记忆、推理、学习等核心认知功能。其建立需结合心理学理论、神经科学证据和计算建模技术。以下是建立认知架构的系统方法…...

C++:买房子

【描述】某程序员开始工作&#xff0c;年薪N万&#xff0c;他希望在中关村公馆买一套60平米的房子&#xff0c;现在价格是200万&#xff0c;假设房子价格以每年百分之K增长&#xff0c;并且该程序员未来年薪不变&#xff0c;且不吃不喝&#xff0c;不用交税&#xff0c;每年所得…...

Webug4.0靶场通关笔记20- 第25关越权查看admin

目录 一、越权原理 1. 水平越权 2. 垂直越权 二、第25关 越权查看admin 1.打开靶场 2.源码分析 &#xff08;1&#xff09;为何存在越权&#xff1f; &#xff08;2&#xff09;如何利用越权&#xff1f; 3.源码修改 4.aaaaa账号登录 5.水平越权切换到mooyuan 6.垂…...

如何在金仓数据库KingbaseES中新建一个数据库?新建一个表?给表添加一个字段?

如何在KingbaseES&#xff08;金仓数据库&#xff09;中新建一个数据库&#xff1f;新建一个表&#xff1f;给表添加一个字段&#xff1f; 摘要 KingbaseES&#xff08;金仓数据库&#xff09;新建数据库、创建表、添加字段全流程实战指南&#xff0c;涵盖 KES 数据库属性、s…...