Получите информацию о профиле ICC из ресурса Adobe Experience Manager

#java #osgi #aem

Вопрос:

Я пытаюсь получить информацию о профиле ICC из актива, но безуспешно. Есть ли какой-либо способ захватить эти поля во время обработки активов на этапе рабочего процесса?

У меня есть такой код, чтобы получить объект активов (это просто для описания моей проблемы), реализованный внутри класса, который наследуется от 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 метаданных.

Есть какие-нибудь предложения?

Ответ №1:

Хорошо, наконец-то решено

Я пользовался этой библиотекой

 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();
            }