【问题标题】:Image Compression In AEMAEM 中的图像压缩
【发布时间】:2018-04-12 11:07:48
【问题描述】:

我们在 DAM 中有大量 png 图像。我们希望以不影响其质量/分辨率的方式压缩这些图像。我经历了几个选择,想知道最好的一个。

我们正在使用 AEM 6.0,并且想知道此功能是否会在 6.0 版本中正常运行。此外,这个工具也有一些漏洞。

  • DAM 更新资产工作流程

我们可以更新工作流程以添加我们的自定义代码块,并通过使用 JAVA7 IO api 我们可以执行压缩。我们还可以在第一阶段添加一个新的流程步骤,以便在此工作流程启动时可以压缩图像作为第一个操作。欢迎任何其他想法。

  • 第三方 API

是否有任何第三方 API 可以使用 CURL 来压缩除了 TinyPNG 之外的图像。

已开始在 6.0 上使用 ImageMagick:

EPS 缩略图(由 ImageMagick 提供支持)步骤如下:

启用Web的再现过程步骤如下:

问题:

  • 图像大小未压缩,大小从 206KB 增加到 208KB。

AEM 日志说:

13.04.2018 15:05:43.111 *INFO* [JobHandler: /etc/workflow/instances/server0/2018-04-13_1/update_asset_439:/content/dam/A.jpg/jcr:content/renditions/original] com.day.cq.dam.core.process.CommandLineProcess execute: executing command line ["C:\Program Files\ImageMagick-6.9.9-Q16\convert.exe" -depth 8 -define jpeg:size=319x319 A.jpg -thumbnail 319x319 cq5dam.thumbnail.319.319.png] for asset [/content/dam/A.jpg]. (Size is 208KB of thumbnail generated)

如果我在本地运行,我可以看到文件大小减少到 130KB。

"C:\Program Files\ImageMagick-6.9.9-Q16\convert.exe" -depth 8 -define jpeg:size=319x319 A.jpg  -thumbnail 319x319 cq5dam.thumbnail.319.319.png

知道为什么图像在 AEM 上不压缩吗?

【问题讨论】:

  • Imagemagick 比人们想象的更安全。它所谓的漏洞是由于用户没有适当地设置他们的 policy.xml 文件安全。 policy.xml 文件用于此目的并且已经存在很长时间了。请参阅imagemagick.org/script/resources.php 处的 policy.xml。另请参阅imagemagick.org/Usage/formats/#jpg_write 处的 -define jpeg:extent={size} 以将 jpg 文件写入给定文件大小。也许这就是你想要的。
  • 嗨,我试过 imagemagick。更新有关我所做更改的问题。
  • 我很困惑。你说你有PNG图像,然后你尝试使用-define JPEG:...减小尺寸,除非你写一个JPEG,否则你也说你不能接受任何质量损失——如果你使用JPEG,这是不可避免的。请澄清。此外,在存储越来越便宜的情况下尝试减小大小似乎很奇怪。
  • 我正在上传 jpeg 图片,输出为 png。
  • -define jpg:size 适合阅读 jpg。见imagemagick.org/Usage/formats/#jpg_read。写jpg时,需要使用-define jpg:extent。问题是您正在有损解压缩一个小的 jpg,这会使文件大小变大,然后写入无损压缩的 PNG。因此,除非您将图像 (-thumbnail) 的大小调整到足够小并删除任何元数据,否则输出的 PNG 文件大小将大于输入的 jpg。抱歉,我对 AEM 一无所知。

标签: imagemagick aem


【解决方案1】:

您需要编写一个 servlet,它会动态压缩图像的大小,从而保持质量和分辨率。

  public class YourServlet extends AbstractImageServlet {

     protected Layer createLayer(AbstractImageServlet.ImageContext imageContext)
        throws RepositoryException, IOException {
        Layer resized = ImageHelper.resize(layer, new Dimension(), new Dimension(0, 0),
                                    new Dimension(768, 768));
      }
    protected void writeLayer(SlingHttpServletRequest request, SlingHttpServletResponse response,
        AbstractImageServlet.ImageContext context, Layer layer, double quality)
                throws IOException, RepositoryException {
        super.writeLayer(request, response, context, layer, QUALITY);
    }

     }

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多