Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取图像格式副本大小?_Java_Freemarker_Magnolia - Fatal编程技术网

Java 如何获取图像格式副本大小?

Java 如何获取图像格式副本大小?,java,freemarker,magnolia,Java,Freemarker,Magnolia,我想在magnolia图像被imageprocessor ImageVariations缩放/裁剪后检索它的高度和宽度,但我似乎没有找到正确的方法 以下是我在theme.yaml中的一个定义: imaging: class: info.magnolia.templating.imaging.VariationAwareImagingSupport variations: "large": class: info.magnolia.templating.imaging.

我想在magnolia图像被imageprocessor ImageVariations缩放/裁剪后检索它的高度和宽度,但我似乎没有找到正确的方法

以下是我在theme.yaml中的一个定义:

imaging:
  class: info.magnolia.templating.imaging.VariationAwareImagingSupport
  variations:
    "large":
      class: info.magnolia.templating.imaging.variation.SimpleResizeVariation
      width: 745
  [...]
我所做的是:

在我的模板FTL中,我首先通过编写[assign]来获取JCR密钥 itemKey=content.backgroundImage!]

我正在使用DAM函数通过其键检索资产 使用damfn.getAssetitemKey

我正在获取格式副本,据我所知,该格式副本是带有dam.getRenditionasset、renditionName的图像的缩放版本

我可以从AssetMetaData读取宽度和高度,但即使使用格式副本对象,我仍然可以获得原始资产元数据,而不是预期的缩放元数据

我做错什么了吗

编辑:请你看看这张照片好吗?它显示了我用来检索maxwidth和maxheight的路径。请告诉我有可能走那条路

谢谢你的帮助

使用DAM API 1.x,您得到的格式副本只是扩展资产,而不涉及元数据,因此您得到的元数据实际上是原始资产的元数据。 使用DAM API 2.x,它稍微好了一点,因为格式副本现在认识到格式副本的元数据与原始资产的元数据不同,但是它也没有提供正确的元数据,只是抛出不支持的操作异常。 所以你被困在任何一条路上。根据您的描述,我猜想您使用的是一些旧版本的Magnolia,其中DAM1.x仍然在使用

至于问题的解决方案,了解图像格式副本大小的唯一方法是了解您使用的变化将如何影响图像。 要动态获取它,您需要掌握成像对象,确定应使用哪种图像生成器(可以在格式副本链接路径中找到),从成像中获取正确的生成器,它很可能是ImageOperationChain的实例,您需要将原始图像加上指定为所需格式副本一部分的所有操作提供给它,让它完成工作,然后从生成的缓冲图像读取宽度/高度,然后将所有这些都扔掉。在呈现模板的过程中,这样做会非常低效

编辑: 如果您想直接从成像模块读取配置,则需要通过JCR API读取配置,并确保在系统上下文中这样做,因为普通用户无法访问此类信息,或者无论如何都不应该访问此类信息。
类似${ctx.getSystemContext.getJCRSessionconfig.getNode/modules/imaging/config/generators/large/operations/resize.getPropertymaxWidth.getString}这样的代码应该可以执行。但它仍然要求您知道将使用哪个生成器,只为您提供生成器的参数,而不保证它将以给定的方式修改资源。例如,在这种情况下,如果资源的宽度小于maxWidth,则不会将图像大小调整为渲染资源宽度小于1300。但是我想你已经知道了。

谢谢你的回答,简!但是我可以简单地使用格式副本变体的名称来计算它的最大宽度,这样我就可以根据它进行分割,并获得我需要的高度吗?不知怎的,是的。理想情况下,从当前状态获取站点,然后使用它获取当前主题,并从主题获取图像和所有列出的变体。但图像处理不会将配置的变体列表暴露给外部。相反,您需要做的是,一旦您通过${state.site.theme.name}找到主题名称,就可以获得该名称并获得主题节点,假设您的主题仍然存在于存储库中,并从中读取变体。如果你的主题是在light module中配置的,并且存在于文件系统中,那么你很可能被卡住了。我编辑了我的答案,并添加了一张显示我将使用的路径的图片。是的,我正在为主题使用YAML配置。您认为有没有一种方法可以使用NodeUtil或其他什么来检索节点路径后面的属性值?或者这就是您所说的“成像不会将配置的变体列表暴露给外部”的意思?我看到的另一个路径是“/modules/site/config/themes/+siteTheme.getName+/imaging/variances”…编辑了对编辑后的问题的回答。您无法访问主题下的变体,因为您使用的是light模块,无法访问文件系统和读取文件,并且也没有任何对象表示这些变体供您在系统的任何位置使用。您所能做的就是从图像生成器读取信息,但您需要知道哪个变体/格式副本将指向哪个生成器。非常感谢您,Jan!到目前为止,你真的帮了我很多。请允许我再问一个问题:是否可以通过JCR配置扩展YAML主题,或者反之亦然?我希望在文件系统上有我的主题资源js、css和JCR中的图像变体。