在 javascript 脚本中将所有 Photoshop 组导出为 .png 时如何修复图层偏移?

How to fix layers offsets when exporting all Photoshop groups to .pngs in a javascript script?

当我在 photoshop 中播放动画时,它看起来不错。每一层都在正确的位置。当我 运行 我的脚本将每个组保存到 png 时,结果有一些图层偏移。

我认为图层在动画中的位置存在奇怪的问题。图层中的图像在一个帧中可能有不同的位置,而不是在另一个帧中。我相信我必须让脚本步进动画中的帧以获得正确的位置,但我不确定我将如何做到这一点。

var set;
var layer;
var count = 0;
for(var i = 0; i < app.activeDocument.layerSets.length; i ++)
{
    set = app.activeDocument.layerSets[i];
    set.visible = false;
    count ++;
}
for(var i = 0; i < app.activeDocument.layerSets.length; i ++)
{
    set = app.activeDocument.layerSets[i];
    set.visible = true;

    // save
    var fileName = set.name.replace(/[\\*\/\?:"\|<> ]/g,'');
    if(fileName.length ==0) fileName = "autoname";
    var handle = File(app.activeDocument.path + "/" + fileName + ".png");
    pngSaveOptions = new PNGSaveOptions();
    activeDocument.saveAs(handle, pngSaveOptions, true, Extension.LOWERCASE);

    set.visible = false;
}

alert("Saved " + count + " images.");

在 photoshop 中播放正确的动画。生成的 .png 不正确。 https://imgur.com/a/y9PLPUX

如果您的动画已经在 Photoshop 时间轴中,也许只将动画渲染到帧会更容易?转到 File > Export > Render Video...,选择 Photoshop Image Sequence 作为渲染器,选择 PNG 作为格式,在渲染选项中不要忘记 select Straight Alpha 通道。这会将所有帧渲染为透明的 PNG。

想通了。该脚本具有可以转到动画中另一帧的功能。我用它来渲染所有 sub-groups 的动画到他们自己单独的 .pngs

var set;
var layer;

for(var docI = 0; docI < app.documents.length; docI ++) {
    var doc = app.documents[docI];
    for (var frameIndex = 1; frameIndex <= 8; frameIndex++) {
        goToFrame(frameIndex);
        for (var i = 0; i < doc.layerSets.length; i++) {
            set = doc.layerSets[i];
            if (set.visible) {
                for (var setI = 0; setI < set.layerSets.length; setI++) {
                    var innerSet = set.layerSets[setI];
                    innerSet.visible = false;
                }
                for (var setI = 0; setI < set.layerSets.length; setI++) {
                    var innerSet = set.layerSets[setI];
                    innerSet.visible = true;
                    var fileName = innerSet.name.replace(/[\\*\/\?:"\|<> ]/g, '');
                    if (fileName.length == 0) fileName = "autoname";
                    var handle = File(doc.path + "/output/" + doc.name.replace("player", fileName).replace(".psd", '') + (doc.layerSets.length - i) + ".png");
                    pngSaveOptions = new PNGSaveOptions();
                    activeDocument.saveAs(handle, pngSaveOptions, true, Extension.LOWERCASE);
                    innerSet.visible = false;
                }

            }
        }
    }
}

alert("Saved images.");

function goToFrame(index) {
    var jumpToFrameNumber = index; // counts from 1

    var desc = new ActionDescriptor();
    var ref1 = new ActionReference();
    ref1.putIndex( stringIDToTypeID( "animationFrameClass" ), jumpToFrameNumber );
    desc.putReference( charIDToTypeID( "null" ), ref1 );
    executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
}