【问题标题】:Image Compression Using MagickQuick in AEM在 AEM 中使用 MagickQuick 进行图像压缩
【发布时间】:2026-01-12 04:30:01
【问题描述】:

我正在使用 ImageQuick 工具来压缩 DAM 图像。我正在使用下面的 sn-p 进行转换。

try {
            System.out.println(" Image is Processing :: " + assetDetails.getName() + "Original Size :: " + assetDetails.getSize());
            ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\ImageMagick-6.9.9-Q16\\convert.exe", "-quality", "85%", assetDetails.getAssetNode().getPath(), assetDetails.getAssetNode().getPath());
            pb.redirectErrorStream(true);

            Process p = pb.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println(p.waitFor());
            session.save();

        } catch (final IOException | RepositoryException | InterruptedException ex) {
            ex.printStackTrace();
        }

得到如下错误:

 Image is Processing :: A.jpgOriginal Size :: 323.8 KB
convert.exe: unable to open image `/content/dam/A.jpg': No such file or directory @ error/blob.c/OpenBlob/2761.
convert.exe: no images defined `/content/dam/A.jpg' @ error/convert.c/ConvertImageCommand/3258.

这里的代码是从本地的 /content/dam 中寻找文件。如何对现有图像执行此操作。

如果我在路径之前添加服务器名称,则会出现以下错误:

convert.exe: no decode delegate for this image format `' @ error/constitute.c/ReadImage/504.
convert.exe: no data returned `http://localhost:4502/content/dam/A.jpg' @ error/url.c/ReadURLImage/247.
convert.exe: no images defined `http://localhost:4502/content/dam/A.jpg' @ error/convert.c/ConvertImageCommand/3258.

PFA*

【问题讨论】:

  • 你为什么用aem标记它?好像不相关,看标签说明
  • 实际上,资产托管在 AEM 服务器上。
  • 您似乎使用了错误的路径(linux 路径,而不是 windows 路径),请确保使用正确的路径。

标签: java aem processbuilder imagemagick-convert


【解决方案1】:

/content/dam/A.jpg 路径是相对于 JCR 存储库的,而不是相对于实际文件系统的路径,因此会启动图像未找到异常。 此外,您的 ImageMagick 安装路径的硬编码值 "C:\\Program Files\\ImageMagick-6.9.9-Q16\\convert.exe 恕我直言似乎不太灵活,因为它在其他环境(测试、预生产、生产......)中可能会有所不同。

实际上,如果您想使用 IM 来改进图像压缩,我建议您在 DAM Update Asset 工作流中添加自定义处理步骤。

例如,为了创建一个固定的 1140x1140 PNG 压缩格式,我会使用:

<node1
        jcr:primaryType="cq:WorkflowNode"
        description="This process step uses IM PNG compression."
        title="IM PNG Mime Type"
        type="PROCESS">
        <metaData
            jcr:primaryType="nt:unstructured"
            COMMANDS="convert ${directory}/${filename} -resize 1140x1140> -strip -depth 24 -define png:compression-filter=2 -define png:compression-level=9 -define png:compression-strategy=1 cq5dam.web.1140.1140.${extension}"
            MIME_TYPES="image/png"
            PROCESS="com.day.cq.dam.core.process.CommandLineProcess"
            PROCESS_AUTO_ADVANCE="true"/>
</node1>

您可以在IM doc 中阅读有关该命令的更多信息,如果您有兴趣将其集成到 OOTB AEM 工作流程中,请以上面的节点模型内容为例,或者看看这个描述得很好的 @987654322 @文章。

【讨论】:

  • 我支持使用 DAM 更新资产工作流进行压缩的建议。
  • 我之前已经检查过了。假设我们在 DAM 中已经有 GB 的图像文件。如果我更新工作流程,如何实现对现有文件的图像压缩?
  • 创建一个 java 进程来查询在某个日期(例如今天)之前上传的资产并对其重新运行 DAM 更新资产工作流。
  • 我尝试了同样的方法,添加了压缩 jpeg 图像的命令。粉煤灰*。我收到一个错误:23.04.2018 17:06:23.951 ERROR [JobHandler: /etc/workflow/instances/server0/2018-04-23_2/update_asset_4:/content/dam/Image-Quality .jpg/jcr:content/renditions/original] com.day.cq.dam.core.process.CommandLineProcess 执行:未能执行命令 [convert -define jpeg:size=319x319 Image-Quality.jpg -thumbnail 319x319 cq5dam.thumbnail .319.319.png] 用于资产 [/content/dam/Image-Quality.jpg]:org.apache.commons.exec.ExecuteException:进程退出并出现错误:4(退出值:4)
  • 那是你的操作系统造成的。 convert 命令可能无法在某些 Windows 版本(例如 Windows SE)上运行,因为它与作为 Windows 安装一部分的本机转换实用程序冲突。将“convert”替换为 ImageMagick 实用程序的完整路径:例如“C:\Program Files\ImageMagick-6.9.9-Q16\convert.exe”。有用吗?