如何获得 ImageRendition 大小?
Posted
技术标签:
【中文标题】如何获得 ImageRendition 大小?【英文标题】:How to get ImageRendition Size? 【发布时间】:2018-03-07 21:08:43 【问题描述】:我想在图像处理器 (ImageVariations) 缩放/裁剪之后检索 magnolia 中图像的高度和宽度,但我似乎没有找到正确的方法。
这是我在 theme.yaml 中所做的一个定义:
imaging:
class: info.magnolia.templating.imaging.VariationAwareImagingSupport
variations:
"large":
class: info.magnolia.templating.imaging.variation.SimpleResizeVariation
width: 745
[...]
我要做的是:
在我的模板 (FTL) 中,我首先通过写入 [#assign
itemKey = content.backgroundImage!""]
来获取 JCR 密钥。
我正在使用 DamFunctions 通过它的键检索资产
damfn.getAsset(itemKey);
我正在使用dam.getRendition(asset, renditionName)
获取再现(我理解为图像的缩放版本)
我可以从 AssetMetaData 中读取宽度和高度,但即使使用 Rendition 对象,我仍然会获得 原始 资产元数据,而不是预期的缩放后的元数据。
我做错了吗?
编辑:你能看看这张照片吗?它显示了我用来检索 maxwidth 和 maxheight 的路径。请告诉我有可能走那条路。
感谢您的帮助!
【问题讨论】:
【参考方案1】:使用 DAM API 1.x,Rendition
您返回的只是扩展资产而不对元数据做任何事情,因此您返回的元数据确实是原始资产的元数据。
使用 DAM API 2.x 时,Rendition
现在可以识别出再现的元数据与原始资产的元数据不同,但它也没有提供正确的元数据,只是抛出了 UnsupportedOperationException
。
因此,无论哪种方式,您都被卡住了。根据您的描述,我认为您使用的是一些旧版本的 Magnolia,但仍在使用 DAM 1.x。
至于您的问题的解决方案,了解图像再现大小的唯一方法是了解您使用的变化将如何影响图像。
要动态获取它,您需要获取Imaging
对象,确定应该使用哪个图像生成器(可以作为再现链接路径的一部分找到),从Imaging
获取正确的生成器,很可能是将是ImageOperationChain
的实例,您需要将原始图像以及指定为您想要的再现的一部分的所有操作提供给它,让它完成它的工作,然后从生成的缓冲图像中读取宽度/高度,然后抛出所有这些。在模板渲染期间这样做会非常低效。
编辑:
如果您想直接从成像模块读取配置,则需要通过 JCR API 读取它,并确保您在系统上下文中执行此操作,因为普通用户无法访问此类信息(或者无论如何都不应该访问)。
像$ctx.getSystemContext().getJCRSession("config").getNode("/modules/imaging/config/generators/large/operations/resize").getProperty("maxWidth").getString()
这样的东西应该可以。但它仍然需要您知道将使用哪个生成器,并且只为您提供生成器的参数,而不保证它会以给定的方式修改资源。例如。在这种情况下,如果资产的宽度小于maxWidth
,图像将不会被调整为渲染的资产宽度将小于 1300。但我想你已经知道了。
【讨论】:
感谢您的回答,简!但是我可以简单地使用再现(变体)的名称来计算它的最大宽度,以便我可以根据它进行划分并获得我需要的高度吗? 不知何故,是的。理想情况下,从当前状态获取站点,然后使用它来获取当前主题,并从主题获取图像和所有列出的变体。但是成像不会将配置的变体列表暴露给外部。相反,您需要做的是,一旦您通过$state.site.theme.name
找到主题名称,获取该名称并获取主题节点(假设您的主题仍然存在于存储库中)并从那里读取变体。如果您的主题配置在 light 模块中并且存在于文件系统中,那么您很可能会卡住。
我编辑了我的答案并添加了一张显示我将使用的路径的图片。是的,我正在为主题使用 YAML 配置。您是否认为有一种方法可以使用 NodeUtil 或其他方式检索该节点路径后面的属性值?还是您所说的“成像不会将配置的变体列表暴露给外部”的意思?我看到的另一条路径是 '/modules/site/config/themes/"+siteTheme.getName()+"/imaging/variations' ...
已编辑答案以响应已编辑问题。您无法访问“主题”下的变体,因为您使用轻量级模块并且无法访问文件系统和读取文件,并且没有代表这些变体的对象供您在系统的任何地方使用。您所能做的就是从成像生成器中读取信息,但您需要知道哪个变体/再现将指向哪个生成器。
非常感谢,简!到目前为止,你真的帮了我很多。请允许我再问一个问题:是否可以通过 JCR-Configuration 扩展 YAML 主题,反之亦然?我想将我的主题资源(js、css)放在文件系统上,并将我的图像变体放在 JCR 中。以上是关于如何获得 ImageRendition 大小?的主要内容,如果未能解决你的问题,请参考以下文章