Возможно ли в Photoshop преобразовать фрагменты в слои Photoshop?
Я хочу сделать изображение и разрезать его на маленькие квадраты, каждый из которых находится в отдельном слое (не экспортировать их как отдельные изображения). Например, если бы у меня было изображение размером 100 на 100 пикселей, и я хотел взять этот слой и создать 100 слоев, каждый размером 10 на 10 квадратов. Изображение будет выглядеть одинаково, но вместо того, чтобы быть одним слоем, оно будет сеткой из отдельных слоев, которые плавно соединяются вместе, как головоломка. Если бы я отключил видимость одного из слоев, это выглядело бы так, как если бы отсутствовал один квадратный "кусочек" головоломки.
Я знаю, что могу нарезать изображение в сетке, экспортировать изображения и затем открыть их как слои, используя Bridge. Проблема этого подхода заключается в том, что я получаю файл размером 10 на 10 пикселей со 100 слоями, уложенными друг на друга, вместо файла размером 100 на 100 пикселей со всеми слоями, расположенными правильно.
Благодарю.
2 ответа
Вы можете сделать все это с помощью Javascript. Вот небольшой небольшой скрипт, который я написал, он скопирует ваше изображение в 100 слоев, каждый по 10 на 10 пикселей:
/*
--------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.
Я внес несколько изменений в скрипт @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);
}
}
}