0

我有这个实现,在页面级别 2 子菜单中使用它。每个 2 级菜单都有多个子页面。每个子页面都有一个图像。所以这个实现从每个页面为每个子菜单生成一个图像。例如,具有 2 个子页面的子菜单将有 2 个图像(每个子页面中的一个)。

1 = FILES
1 {
    references {
        table = pages
        fieldName = media
        data = levelmedia:-1, slide
    }

    begin = 0
    maxItems = 2

    renderObj = COA
    renderObj {
        2 = IMAGE
        2 {
            file {
                //params = -sharpen 50  +profile "*" -quality 100
                import.data = file:current:uid
                treatIdAsReference = 1
                width.optionSplit = 300c|*|400c
                height.optionSplit = 350c|*|450c
            }
        }
    }
}

想要以不同尺寸裁剪图像,以便将图像 1 切割成与图像 2 不同的尺寸,依此类推。

我的 ImageMagick 安装完美。实际上,我可以毫不费力地裁剪单个图像。

如果没有optionSplit上述内容,图像会被很好地切割成合适的尺寸。不幸的是,optionSplit它只是以原始尺寸输出图像。

我怎样才能产生不同的图像尺寸?我的理解是这optionSplit是要走的路(来自手册)。我在文章中读到soureCollection响应式图像使用optionSplit. 我想另一种方法是使用图像寄存器计数器并使用 CASE 来确定如何剪切图像 1、2、3 等,但不熟悉寄存器计数器(也许有人可以告诉我如何做到这一点?)。另一种方法是使用文件/图像索引号,但我已经尝试查看手册几个小时来寻找这样的指针,但如果有任何帮助处理的话,它没有列出。有人知道这样做的方法吗?

4

2 回答 2

1

用不同的参数渲染两个连续的图像在打字稿中会很困难:你的选项分割
不能成功,因为在 renderObj 中你总是只有一个文件。一个坏习惯renderObj

另一方面:没有财产optionSplit。该功能构建在任何 wrap 属性中。

因此,打字稿中的处理可能是连接元素,然后再次拆分它们,然后在拆分的 renderObj 中使用不同的选项来单独处理它。
或使用寄存器变量实现计数器,然后评估寄存器以设置不同的值。

更容易的是在流体中进行处理,您可以在其中使用带有f:forviewhelper 的迭代器,然后执行f:if(对于两种情况)或f:switch(对于更多情况){iterator.index}以呈现单个版本。

于 2020-04-01T12:00:51.927 回答
0

基于@Bernd每个页面(作为项目)在每次迭代中作为对象交付的事实的答案,TMENU可以通过以下两种方式之一来实现这样的图像渲染:

首先,通过使用两个寄存器条目register:count_menuItems来保存您将要处理的项目总数;并register:count_MENUOBJ保存当前正在迭代的项目的索引(从 1 开始)。这两个可以与CASE语句结合使用,以根据自己的喜好彻底处理每个图像。如果一个页面有多个图像,还有两个可以使用的寄存器项,它们是,register:FILES_COUNT(从 0 开始计数)和register:FILES_NUM_CURRENT。无需实现注册表计数器,因为这些注册表项本身就是计数器。

其次,有一种更简单的方法,一种更省时的方法,它使用@Bernd 解释的包装,如下所示;

NO = 1
NO {
    1 = LOAD_REGISTER
    1 {
        width.cObject = TEXT
        width.cObject.stdWrap.wrap = 100c||200c

        height.cObject = TEXT
        height.cObject.stdWrap.wrap = 300c||400c
    }

    2 = FILES
    2 {
        # Get the images related to the current page
        references {
            table = pages
            fieldName = media
        }
        # Render each image and wrap it as appropriate
        renderObj = IMG_RESOURCE
        renderObj {
            file {
                treatIdAsReference = 1
                import.data = file:current:uid
                width = {REGISTER:width}
                width.insertData = 1
                height = {REGISTER:height}
                height.insertData = 1
            }
        }
        stdWrap {
            wrap = <img src="|"  />
        }
    }
}

如您所见,此代码用于 aTMENU并根据段中定义1并由LOAD_REGISTER. 诀窍在于包装。stdWrapwrap已经包含optionSplit. 因此,通过存储所需的模式,stdWrap将为每次迭代处理要存储的正确值。

它对我有用。希望它可以帮助某人。

于 2020-04-01T13:15:22.657 回答