如何获取ImageRendition Size?
How to get ImageRendition Size?
我想在图像处理器 scaled/cropped 中检索图像的 高度和宽度 (ImageVariations) 但我似乎没有找到正确的方法。
这是我在 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 对象,我仍然得到 原始 资产元数据,与预期不同,是缩放后的元数据。
我是不是做错了什么?
编辑:你能看看这张照片吗?它显示了我将用来检索最大宽度和最大高度的路径。请告诉我可以走那条路。
感谢您的帮助!
使用 DAM API 1.x,Rendition
你得到的只是扩展资产而不对元数据做任何事情,因此你得到的元数据确实是原始资产的元数据。
使用 DAM API 2.x 它稍微好一点 Rendition
现在可以识别再现的元数据与原始资产的元数据不同,但是它也没有提供正确的元数据,只是抛出 UnsupportedOperationException
.
所以无论哪种方式你都被困住了。根据您的描述,我推测您使用的是一些旧版本的 Magnolia,其中 DAM 1.x 仍在使用。
至于您的问题的解决方案,了解图像再现大小的唯一方法是了解您使用的变化将如何影响图像。
要动态获取它,您需要获取 Imaging
对象,确定应使用哪个图像生成器(可以作为再现路径的一部分找到 link),从 Imaging
,它很可能是 ImageOperationChain
的实例,您需要将原始图像以及所有指定为您想要的再现的一部分的操作提供给它,让它完成它的工作,然后阅读width/height 来自生成的缓冲图像,然后将其全部丢弃。在模板渲染期间这样做效率会非常低。
编辑:
如果你想直接从成像模块读取配置,你需要通过 JCR API 读取它并确保你在系统上下文中这样做,因为普通用户无法访问此类信息(或者无论如何都不应该访问) ).
${ctx.getSystemContext().getJCRSession("config").getNode("/modules/imaging/config/generators/large/operations/resize").getProperty("maxWidth").getString()}
之类的东西应该可以。但它仍然需要你知道将使用什么生成器,并且只为你提供生成器的参数,不保证它会以给定的方式修改资源。例如。在这种情况下,如果资产的宽度小于 maxWidth
,图像将不会调整大小以呈现资产宽度将小于 1300。但我想你已经知道了。
我想在图像处理器 scaled/cropped 中检索图像的 高度和宽度 (ImageVariations) 但我似乎没有找到正确的方法。
这是我在 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 对象,我仍然得到 原始 资产元数据,与预期不同,是缩放后的元数据。
我是不是做错了什么?
编辑:你能看看这张照片吗?它显示了我将用来检索最大宽度和最大高度的路径。请告诉我可以走那条路。
感谢您的帮助!
使用 DAM API 1.x,Rendition
你得到的只是扩展资产而不对元数据做任何事情,因此你得到的元数据确实是原始资产的元数据。
使用 DAM API 2.x 它稍微好一点 Rendition
现在可以识别再现的元数据与原始资产的元数据不同,但是它也没有提供正确的元数据,只是抛出 UnsupportedOperationException
.
所以无论哪种方式你都被困住了。根据您的描述,我推测您使用的是一些旧版本的 Magnolia,其中 DAM 1.x 仍在使用。
至于您的问题的解决方案,了解图像再现大小的唯一方法是了解您使用的变化将如何影响图像。
要动态获取它,您需要获取 Imaging
对象,确定应使用哪个图像生成器(可以作为再现路径的一部分找到 link),从 Imaging
,它很可能是 ImageOperationChain
的实例,您需要将原始图像以及所有指定为您想要的再现的一部分的操作提供给它,让它完成它的工作,然后阅读width/height 来自生成的缓冲图像,然后将其全部丢弃。在模板渲染期间这样做效率会非常低。
编辑:
如果你想直接从成像模块读取配置,你需要通过 JCR API 读取它并确保你在系统上下文中这样做,因为普通用户无法访问此类信息(或者无论如何都不应该访问) ).
${ctx.getSystemContext().getJCRSession("config").getNode("/modules/imaging/config/generators/large/operations/resize").getProperty("maxWidth").getString()}
之类的东西应该可以。但它仍然需要你知道将使用什么生成器,并且只为你提供生成器的参数,不保证它会以给定的方式修改资源。例如。在这种情况下,如果资产的宽度小于 maxWidth
,图像将不会调整大小以呈现资产宽度将小于 1300。但我想你已经知道了。