我想要做的是拍摄一张图片并将其切成小方块,每个小方块位于不同的图层(而不是将它们导出为单独的图像)。
例如,如果我有一张 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);
}
}
}