在 Photoshop 中可以将切片转换为 Photoshop 图层吗?

在 Photoshop 中可以将切片转换为 Photoshop 图层吗?

我想要做的是拍摄一张图片并将其切成小方块,每个小方块位于不同的图层(而不是将它们导出为单独的图像)。

例如,如果我有一张 100px x 100px 的图像,我想利用该图层创建 100 个图层,每个图层都是 10px x 10px 的正方形。图像看起来是一样的,但不是一个图层,而是一个由多个独立图层组成的网格,这些图层像拼图一样无缝拼接在一起。如果我关闭其中一个图层的可见性,看起来就像拼图中缺少了一个正方形“碎片”。

我知道我可以将图像切成网格,然后导出图像,再使用 Bridge 将它们作为图层打开。这种方法的问题在于,我最终会得到一个 10px x 10px 的文件,其中有 100 个图层堆叠在一起,而不是一个 100px x 100px 的文件,其中所有图层都排列正确。

答案1

您可以使用 Javascript 完成所有这些操作。这是一个简短的脚本我已经写过了,它会将你的图像复制到 100 个图层中,每个图层为 10px x 10px:

/*
--------Photoshop Script - Grid to Layers------------
Author: Oisin Conolly
        www.DigitalBiscuits.co.uk

This basic script will create new layers from your active layer, each equal in size according to the grid dimensions specified.
*/


//this is the size of our squares in pixels
var squareSize = 10;



var docRef = app.activeDocument;

//set the ruler type
if (app.preferences.rulerUnits != Units.PIXELS)
{
    app.preferences.rulerUnits = Units.PIXELS;
}

var layerRef = docRef.activeLayer;

for (y = 0; y<docRef.height; y+=squareSize)
{
    for (x = 0; x<docRef.width; x+=squareSize)
    {
        //activate the original layer
        docRef.activeLayer = layerRef;
        //make the selection
        docRef.selection.select(Array (Array(x, y), Array(x, y+squareSize), Array(x+squareSize,y+squareSize), Array(x+squareSize,y)), SelectionType.REPLACE, 0, false);
    
        //copy the selection
        docRef.selection.copy();
        //create and paste new layer
        docRef.artLayers.add();
        docRef.paste();
    }
}

要使用它,请保存该文件并通过 Photoshop 加载它,方法是:

文件 > 脚本 > 浏览

确保文件类型设置为 *.JS

如果您想改变方块的大小,只需在记事本中打开 JavaSCript 文件,更改值squareSize,然后保存并运行它。


此外,如果你想用这个脚本做更高级的事情,你可以下载一个Photoshop 脚本参考指南其中列出了您可以使用的所有类、函数和变量。(例如如何旋转图层)。

上述脚本使用 JavaScript 语法,但是您也可以使用 AppleScript 和 VBScript 与 Photoshop 配合使用。

答案2

我对@OACDesigns 脚本做了一些调整,使其能够:

  • 正确处理透明层,不会抛出错误
  • 切片图层放在一个图层组中
  • 显示输入所需网格大小的提示
/*
--------Photoshop Script - Grid to Layers------------
Original Script Author: Oisin Conolly (www.DigitalBiscuits.co.uk)
Modified by a stackoverflow user.

This basic script will create new layers from your active layer, each equal in size according to the grid dimensions specified.
*/

//Use docRef.selection.copy() will throw exception when try to copy empty selection
//https://community.adobe.com/t5/photoshop/try-to-copy-when-no-pixels-where-selected/td-p/10417075
function TryCopySelection()
{
    try { executeAction(stringIDToTypeID("copyEvent"), undefined, DialogModes.NO); } catch(e) { return false; }
    return true;
}

//Paste in place is required as otherwise, paste item could be at incorrect position
//https://stackoverflow.com/questions/25904603/paste-in-place-photoshop-script
cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };
function PasteInPlace() {
    var dialogMode = DialogModes.NO;
    var desc1 = new ActionDescriptor();
    desc1.putBoolean(sTID("inPlace"), true);
    desc1.putEnumerated(cTID('AntA'), cTID('Annt'), cTID('Anno'));
    executeAction(cTID('past'), desc1, dialogMode);
};


//this is the size of our squares in pixels
var squareSize = 1024;
squareSize = parseInt(prompt("Please enter slice grid size:", 1024));

var docRef = app.activeDocument;

//set the ruler type
if (app.preferences.rulerUnits != Units.PIXELS)
    app.preferences.rulerUnits = Units.PIXELS;

var sourceLayer = docRef.activeLayer;
var layerSet = docRef.layerSets.add(); //Create new layer group
layerSet.name = sourceLayer.name + " Group";

for (y = 0; y<docRef.height; y+=squareSize)
{
    for (x = 0; x<docRef.width; x+=squareSize)
    {
        //activate the original layer
        docRef.activeLayer = sourceLayer;
        //make the selection
        docRef.selection.select(Array (Array(x, y), Array(x, y+squareSize), Array(x+squareSize,y+squareSize), Array(x+squareSize,y)), SelectionType.REPLACE, 0, false);
        
        //copy the selection
        if(TryCopySelection())
        {
            var layer = docRef.artLayers.add(); //create and paste new layer
            PasteInPlace()
            layer.move(layerSet, ElementPlacement.INSIDE);
        }
    }
}

相关内容