Нужна помощь с настройкой скрипта для пакетного экспорта частей изображения в Photoshop

Решено : Всем спасибо за помощь! Скрипт Сергея Крицкого работает для экспорта раскадровок с последовательным именем файла.


На днях я нашел сценарий от TunaMaxx и подумал, что очень полезно экспортировать свои раскадровки.

Прямо сейчас он экспортирует весь первый столбец, затем 2-й столбец, затем 3-й и 4-й столбцы. В итоге мои доски помечены в неправильном порядке: «1, 5, 9, 13», затем «2, 6, 10, 14» и так далее. (изображения ниже)

Мне было интересно, возможно ли каким-то образом экспортировать его по строкам, чтобы мои доски сохранялись / назывались как «1, 2, 3, 4 .. и т. Д.?» Кажется, это не имеет большого значения, но когда я экспортирую более 200 досок, очень сложно вернуться и реорганизовать все это. (Без скрипта я прибегаю к созданию направляющих линий и использованию инструмента «Срез».)

Я включил скриншоты ниже того, что я ищу в фотошопе и как это выглядит после экспорта.

Ниже представлен JPEG, с которым я работаю. Каждый кадр имеет ширину 2000 пикселей и высоту 1090 пикселей. Смещение по оси x составляет 200 пикселей, а по оси y — 100 пикселей.Исходный файл для экспорта

На фото ниже показано, что происходит, когда я пытаюсь экспортироватьвведите описание изображения здесь

некорректный экспорт

ты отредактировал мой скрипт в соответствии с твоими пользовательскими значениями???
Да, я настраиваю ширину и высоту на 2000 x 1090 пикселей, xoffset — 200 пикселей, yoffset — 100 пикселей. Не уверен, почему он экспортируется с желобом

Ответы (3)

Попробуй это:

// Alter these as needed
var cellWidth         = 2000; // The width, in px, of your image cell
var cellHeight        = 1090; // The height, in px, of your image cell
var xOffset           = 200; // The space, in px, between each cell in a row
var yOffset           = 100; // The space, in px, between each row. Set to 0 for traditional checker board effect
var options           = new ExportOptionsSaveForWeb();
options.format    = SaveDocumentType.JPEG;
options.quality   = 100;

// Don't change these unless you know why you should! :)
var doc               = app.activeDocument;
var dname             = doc.name.substr(0,doc.name.length-4);
var dir               = doc.path.toString()+"/";
var rowShift          = true;
var imageWidth        = activeDocument.width.as('px');
var imageHeight       = activeDocument.height.as('px');

// Store the current rulerUnits for later. We're going to change
// it to pixels for now, and we want to change it back later.
var myRulerUnits = app.preferences.rulerUnits;

// Set rulerUnits to pixels
app.preferences.rulerUnits = Units.PIXELS;

// Find the "Background"
var layerRef = doc.artLayers.getByName("Background");

// Set our "Background" to be a Layer
layerRef.isBackgroundLayer = false;

// Reduce the Canvas size to our cell size
doc.resizeCanvas(cellWidth, cellHeight, AnchorPosition.TOPLEFT);

var totalOffset = 0;
var xMovement = 0;
var yMovement = 0;

// Do the magic
for (var y = 0; y < numberOfRows(); y++)
{
    totalOffset = 0;

    for (var x = 0; x < numberOfCells(); x++)
    {
        if (x == 0)
        {
            xMovement = 0;
            totalOffset += xMovement;
            yMovement = yOffset
        }
        else
        {
            xMovement = cellWidth;
            totalOffset += (xMovement+xOffset);
            yMovement = 0
        }           

        // Offset the layer into our Canvas "window"
        layerRef.applyOffset(-(xMovement+xOffset), -yMovement, OffsetUndefinedAreas.WRAPAROUND);

        saveCell(y,x);
    };

    // Offset the layer back to the left and down one row
    layerRef.applyOffset(totalOffset+xOffset, -(cellHeight), OffsetUndefinedAreas.WRAPAROUND);

    // Flip the rowShift. If it was true, make it false and vice versa.
    rowShift = !rowShift;
};

// Calculate number of cells per row. May change depending in rowShift, etc
function numberOfCells()
{
    var theWidth = imageWidth;

    if (rowShift == true)
    {
        var theWidth = theWidth - xOffset; 
    }
    return Math.floor((theWidth + xOffset) / (cellWidth + xOffset));
}

// Calculate number of rows
function numberOfRows()
{
    return Math.floor((imageHeight + yOffset) / (cellHeight + yOffset));
}

// Pad the cell x and y numbers for proper sorting
function pad(num, size)
{
    var s = "000000000" + num;
    return s.substr(s.length-size);
}

// Actually save, or really "Save For Web" the cell
function saveCell(x, y)
{
    var nname = dname + "_" + pad((x + 1), 3) + "_" + pad((y + 1), 3);

    doc.exportDocument (new File(dir + "/" + nname + ".jpg"), ExportType.SAVEFORWEB, options);
}

// Reset the ruler units
app.preferences.rulerUnits = myRulerUnits;

PS вам нужно, чтобы кадры имели строку/столбец, или вы хотите, чтобы они имели последовательные имена?

О боже! Большое спасибо! Ваш скрипт работает. Все это экспортируется в кадре и имеет правильное последовательное имя файла. Спасибо, Сергей!

Это работает?? :)

    // Alter these as needed
var cellWidth         = 240; // The width, in px, of your image cell
var cellHeight        = 240; // The height, in px, of your image cell
var xOffset           = 240; // The space, in px, between each cell in a row
var yOffset           = 240; // The space, in px, between each row. Set to 0 for traditional checker board effect
var options           = new ExportOptionsSaveForWeb();
    options.format    = SaveDocumentType.JPEG;
    options.quality   = 75;

// Don't change these unless you know why you should! :)
var doc               = app.activeDocument;
var dname             = doc.name.substr(0,doc.name.length-4);
var dir               = doc.path.toString()+"/";
var rowShift          = true;
var imageWidth        = activeDocument.width.as('px');
var imageHeight       = activeDocument.height.as('px');

// Store the current rulerUnits for later. We're going to change
// it to pixels for now, and we want to change it back later.
var myRulerUnits = app.preferences.rulerUnits;

// Set rulerUnits to pixels
app.preferences.rulerUnits = Units.PIXELS;

// Find the "Background"
var layerRef = doc.artLayers.getByName("Background");

// Set our "Background" to be a Layer
layerRef.isBackgroundLayer = false;

// Reduce the Canvas size to our cell size
doc.resizeCanvas(cellWidth, cellHeight, AnchorPosition.TOPLEFT);

var totalOffset = 0;
var xMovement = 0;

// Do the magic
for (var y = 0; y < numberOfRows(); y++)
{
    totalOffset = 0;

    for (var x = 0; x < numberOfCells(); x++)
    {
        if (x == 0)
        {
            xMovement = (rowShift) ? xOffset : 0;
        }
        else
        {
            xMovement = cellWidth + xOffset;
        }

        totalOffset += xMovement;

        // Offset the layer into our Canvas "window"
        layerRef.applyOffset(-(xMovement), 0, OffsetUndefinedAreas.WRAPAROUND);

        saveCell(x,y);
    };

    // Offset the layer back to the left and down one row
    layerRef.applyOffset(totalOffset, -(cellHeight + yOffset), OffsetUndefinedAreas.WRAPAROUND);

    // Flip the rowShift. If it was true, make it false and vice versa.
    rowShift = !rowShift;
};

// Calculate number of cells per row. May change depending in rowShift, etc
function numberOfCells()
{
    var theWidth = imageWidth;

    if (rowShift == true)
    {
        var theWidth = theWidth - xOffset; 
    }
    return Math.floor((theWidth + xOffset) / (cellWidth + xOffset));
}

// Calculate number of rows
function numberOfRows()
{
    return Math.floor((imageHeight + yOffset) / (cellHeight + yOffset));
}

// Pad the cell x and y numbers for proper sorting
function pad(num, size)
{
    var s = "000000000" + num;
    return s.substr(s.length-size);
}

// Actually save, or really "Save For Web" the cell
function saveCell(x, y)
{
    var nname = dname + "_" + pad((y + 1), 3) + "_" + pad((x + 1), 3);

    doc.exportDocument (new File(dir + "/" + nname + ".jpg"), ExportType.SAVEFORWEB, options);
}

// Reset the ruler units
app.preferences.rulerUnits = myRulerUnits;
На 1 минуту быстрее :) (+1).
Спасибо вам за помощь! Я столкнулся с одной новой проблемой со смещениями сейчас
хорошо ; даже у оригинала тоже есть проблемы :P думаю, я полностью это пойму XD

В коде TunaMaxx вы заметите эту функцию:

// Actually save, or really "Save For Web" the cell
function saveCell(x, y)
{
    var nname = dname + "_" + pad((x + 1), 3) + "_" + pad((y + 1), 3);

    doc.exportDocument (new File(dir + "/" + nname + ".jpg"), ExportType.SAVEFORWEB, options);
}

Он вызывается ранее в коде:

saveCell(x,y);

Похоже, что вам нужно просто поменять местами x и y, чтобы иметь приращения по горизонтали.

попробуй поменять saveCell(x,y);сsaveCell(y,x);

Единственное, что нужно иметь в виду, это настроить их по мере необходимости:

var xOffset           = 240; // The space, in px, between each cell in a row
var yOffset           = 240; // The space, in px, between each row. Set to 0 for traditional checker board effect

(Помню, изначально мне нужна была диагонально смещенная сетка)

я просто поменял местами x, y в своем ответе, и это работает для меня3
Большое спасибо! Теперь у меня новая проблема со смещением. Я обновил этот вопрос, чтобы включить еще одну фотографию. Я неправильно ввожу смещение?
что произойдет, если вы установите смещения x и y равными 0?
Когда для обоих параметров установлено значение 0, экспорт полностью отсутствует в кадре и на всех 16 изображениях отображаются поля. эй
Упс :) Соответствуют cellWidthли cellHeightразмеры вашего одиночного изображения в более крупной композиции? Как выглядит исходный документ?
О, я только что добавил новую фотографию в формате JPEG, для которой я использую скрипт. Он находится в разделе «Редактировать 2». Я правильно отрегулировал cellWidth и cellHeight. Не уверен, что происходит сейчас