java - 从 Adobe Experience Manager 资产中获取 ICC 配置文件信息
问题描述
我正在尝试从资产中获取 ICC PRofile 信息,但没有运气。有没有办法在工作流步骤中的资产处理期间获取这些字段?
我有这样的代码来获取在继承自 WorkflowProcess 的类中实现的资产对象(它只是为了描述我的问题):
ResourceResolver resolver = workflowSession.adaptTo(ResourceResolver.class);
String path = workItem.getWorkflowData().getPayload().toString();
if (StringUtils.contains(path, JcrConstants.JCR_CONTENT)) {
path = StringUtils.substringBefore(path, JcrConstants.JCR_CONTENT);
}
Resource resource = resolver.getResource(path);
Asset asset = resource == null ? null : resource.adaptTo(Asset.class);
if (asset == null) {
log.info("Asset is null, skipping metadata extraction");
}
assert asset != null;
String layerName = asset.getMetadata("photoshop:LayerName") != null ? asset.getMetadata("photoshop:LayerName").toString() : "";
Map<String, Object> meta = asset.getMetadata();
在最后一行,我看不到元数据 ICC 字段。
有什么建议么?
解决方案
好的,终于解决了
我用过这个库
org.apache.commons.imaging
然后很容易
Asset asset = resource == null ? null : resource.adaptTo(Asset.class);
Iterator<? extends Rendition> rendition = asset.listRenditions();
if (rendition.hasNext()) {
Rendition ren = rendition.next();
try {
byte[] assetByteArray = new byte[ren.getStream().available()];
ren.getStream().read(assetByteArray);
Imaging.getImageInfo(assetByteArray).getColorType();
ICC_Profile iccProfile = Imaging.getICCProfile(assetByteArray);
if (iccProfile != null) {
int cs = iccProfile.getColorSpaceType();
String colorSpaceName = getColorSpaceName(cs);
Resource assetResource = resolver.getResource(path);
Resource metadatResource = assetResource.getChild(DamConstants.METADATA_PATH);
ModifiableValueMap mvmForAsset = metadatResource.adaptTo(ModifiableValueMap.class);
mvmForAsset.put(DamConstants.ASSET_COLORSPACE, colorSpaceName);
try {
resolver.commit();
} catch (PersistenceException e) {
log.error("Error occurred during saving metadata value {}", e.getMessage());
} finally {
resolver.close();
}
推荐阅读
- azure - 是否调用 Azure API 来列出我在订阅中使用的区域中的资源详细信息?
- wso2 - 我们如何防止属性传播到 WSO2 队列中?
- github - 如何集成 Azure devops board 和 Github?
- javascript - 如何从节点 js 将数据发送到客户端
- android - 在 Expo 或 React Native 中用于 Android Webview 应用程序的 Admob
- inria-spoon - 如何从编译单元获取所有导入语句?
- flutter - 如何制作这个 Flutter Page 幻灯片指示器?
- java - 如何在 mongo db 中执行数据同步
- hyperledger-fabric - Hyperledger Fabric:标记了以下静态检查问题:*** [Makefile:186:linter] 错误 1
- glsl - 超级简单的光线追踪