如何在调整对象大小时保持边距(位置)相同

问题描述 投票:0回答:1

什么是问题?

我不想让社区对我的问题感到困惑,所以我会说我的问题是基于Java的(特别是Photoshop's DOM)。因此,如果有人可以在需要基本javascript的函数/逻辑上为我提供帮助,而不是他们可以进一步阅读,请致谢。

现在;情况是,我正在免费赠予一个名为“ PS Blender”的Photoshop插件(HTML面板),该软件将模拟Illustrator Blend Tool的相同功能,尽管Illustrator具有非常复杂而强大的Blending选项,而我只是打算制作与位置,旋转,比例和透明度的基本混合。第一个原型已经准备就绪,我已经测试了除比例混合外一切正常的地方。在继续之前,请注意以下GIF,以便您了解情况。

  • 首先尝试使用位置和透明度,效果似乎很好First try with positions and transparency, which seems working perfectly

  • 包含缩放的第二次尝试,效果不佳(结果应该像我在GIF末尾刷过一样)Second try with scaling included, which doesn't works well (The result should be like I brushed in the end of GIF)

我关于问题的代码

所以生成Blend的整个功能是...。

function generateBlend(data) {
    //Get user's input from panel
    var newLayerPositionX = data.split("&&&&")[0];
    var newLayerPositionY = data.split("&&&&")[1];
    var newLayerScaleX = data.split("&&&&")[2];
    var newLayerScaleY = data.split("&&&&")[3];
    var newLayerRotation = data.split("&&&&")[4];
    var newLayerTransparency = data.split("&&&&")[5];
    var steps = parseInt(data.split("&&&&")[6]);
    //calculates the difference between values where start values are the real data and new values are user input
    var xTransform = parseFloat(newLayerPositionX) - parseFloat(startLayerPositionX);
    var yTransform = parseFloat(newLayerPositionY) - parseFloat(startLayerPositionY);
    var xScale = parseFloat(newLayerScaleX) - parseFloat(startScaleX); //if positive then increase size and on negative decrease
    var yScale = parseFloat(newLayerScaleY) - parseFloat(startScaleY);
    var rot = parseFloat(newLayerRotation) - parseFloat(startRotation);
    var trans = parseFloat(newLayerTransparency) - parseFloat(startTransparency);
    //dummy variables to call after every increment in for loop
    var masterScaleX = parseFloat(startScaleX);
    var masterScaleY = parseFloat(startScaleY);
    var masterRotation = parseFloat(startRotation);
    var masterTransparency = parseFloat(startTransparency);
    //create a new smart object to start copying and cloning layers (steps)
    editSmartObject();
    duplicateLayer();
    moveLayerBelow();
    convertToSmart();
    renameLayer("SmartObject");
    //define masterPositionX and Y because startPositionX is the value of layers bound which lies in original document while our current layer lies in the smart object of original document so bounds need to be updated
    var docRef = app.activeDocument;
    var curLayer = docRef.activeLayer;
    var curLayerBounds = curLayer.bounds;
    var curLayerPositionX = curLayerBounds[0].value + ((curLayerBounds[2].value - curLayerBounds[0].value) / 2);
    var curLayerPositionY = curLayerBounds[1].value + ((curLayerBounds[3].value - curLayerBounds[1].value) / 2);
    var masterPositionX = parseFloat(curLayerPositionX);
    var masterPositionY = parseFloat(curLayerPositionY);
    //generates incremental values i.e. 50px move in 5 steps gives 10px per step.
    var splitPositionX = parseFloat(xTransform) / steps;
    var splitPositionY = parseFloat(yTransform) / steps;
    var splitScaleX = parseFloat(xScale) / steps;
    var splitScaleY = parseFloat(yScale) / steps;
    var splitRotation = parseFloat(rot) / steps;
    var splitTransparency = parseFloat(trans) / steps;
    //the main code for generating blends starts here
    for (var i = 0; i < steps; i++) {
        //updates masterPositing by adding splits
        masterPositionX = masterPositionX + parseFloat(splitPositionX);
        masterPositionY = masterPositionY + parseFloat(splitPositionY);
        //Photoshop DOM Scale method is relative rather than absolute so if we will change scale to 50 then it won't resize object by 50% but it will resize objects half by it's current size so we need to tweak resize method
        var masterScaleX = parseFloat(((masterScaleX + splitScaleX) * 100) / masterScaleX);
        var masterScaleY = parseFloat(((masterScaleY + splitScaleY) * 100) / masterScaleY);
        var masterRotation = masterRotation + parseFloat(splitRotation);
        var masterTransparency = masterTransparency + parseFloat(splitTransparency);
        //starts looping in where order will be duplicate SO-clear mask-move downside-apply transformation-select above layer-select bound-below layer mask (This all steps are what makes blend layers)
        try {
            duplicateLayer();
            moveLayerBelow();
            if (hasMask() == true) {
                selectLayerMask();
                deleteLayerMask();
            }
            transformLayer(parseFloat(splitPositionX), parseFloat(splitPositionY))
            resizeLayer(masterScaleX, masterScaleY);
            rotateLayer(masterRotation);
            changeTransparency(masterTransparency);
            revealAll();
            selectAboveLayer();
            selectBoundOfLayer()
            selectBelowLayer();
            createMask();
            invert();
            trim();
        } catch (e) {
            alert(e);
        }
    }
}

正如您在上面的try段中所见,我通过调用单独的方法来完成所有工作;现在,您可能只对Resize方法感兴趣,而该代码是....

function resizeLayer(xScale, yScale) {
    app.activeDocument.activeLayer.resize(xScale, yScale, AnchorPosition.MIDDLECENTER);
}

请参阅这是从JS官方参考直接分支的非常基本的功能。

我尝试了什么?

好吧,我尝试了各种方法,例如更改AnchorPosition等,但是由于混合方向可以是任意方向,所以我真的找不到找到使之起作用的方法。好了,功能正在起作用。让我们举一个简单的例子:认为该层应该在每一步上移动10px,并且应该将其调整大小5%,现在,如果没有任何调整大小,那么它将以每10px移动克隆,但是如果我们现在要调整其大小,那么我们需要移动克隆10px +由于调整大小而减少的区域,由于我根本不是开发人员,并且对JS非常了解,因此似乎无法弄清该区域。

我需要什么?

我需要的是一些有关如何编码调整大小的逻辑以解决此问题的指导。您的所有贡献将非常有帮助,因为这是我为社区制作的免费赠品,如果您也需要的话,我可以共享源代码。感谢您抽出宝贵时间回答我的问题。

最好的问候!

photoshop-script
1个回答
0
投票

很抱歉打扰您,但我找到了解决方法,有趣的事实是我的同事提出了答案。

这个过程非常简单,问题本身也有答案,但我从这个角度从未想到过。问题是即使对象按比例缩小时如何保持边距,而我要做的就是向xDisplacement添加按比例缩小的像素,并且效果很好。

这甚至是一件好事,我决定不自己制作插件,因为我担心自己是新手,所以可能会遇到数百个问题,因为我是开发人员,更新的代码和PS Blender GitHub页上提供了第一个原型。 (不确定在这里是否应该提及此内容,因为它显然看起来像是促销活动,但是由于我将其发布为开放源代码,也许可以发布链接了。)

© www.soinside.com 2019 - 2024. All rights reserved.