Разделение слоя на 75 пикселей поровну с помощью файла JavaScript в Adobe Photoshop

Рассмотрим мой код:

// Ensure a document is open
if (app.documents.length > 0) {
    var doc = app.activeDocument;
    var originalLayer = doc.activeLayer; // Store reference to the original layer

    // Check if the layer is not the background layer
    if (!originalLayer.isBackgroundLayer) {
        var layerBounds = originalLayer.bounds;
        var layerWidth = layerBounds[2].as('px') - layerBounds[0].as('px'); // Convert bounds to pixels
        var layerHeight = layerBounds[3].as('px') - layerBounds[1].as('px'); // Convert bounds to pixels
        var segmentWidth = 75; // Width of each segment in pixels

        for (var x = 0; x < layerWidth; x += segmentWidth) {
            doc.activeLayer = originalLayer; // Reactivate the original layer
            // Create a selection for the segment
            var segmentRight = Math.min(x + segmentWidth, layerWidth);
            var selectionCoords = [
                [x, 0],
                [segmentRight, 0],
                [segmentRight, layerHeight],
                [x, layerHeight]
            ];

            // Check if the selection coordinates are valid
            if (isValidSelection(selectionCoords)) {
                doc.selection.select(selectionCoords);
                // Copy the selection to a new layer
                doc.selection.copy();
                var newLayer = doc.artLayers.add();
                doc.paste();
                newLayer.name = "Segment " + (x / segmentWidth + 1);

                // Deselect to avoid interference in the next loop
                doc.selection.deselect();
            } else {
                alert("Invalid selection coordinates.");
            }
        }
        alert("Layer divided into 25-pixel segments.");
    } else {
        alert("The active layer is the background layer and cannot be divided.");
    }
} else {
    alert("No document open.");
}

// Function to check if selection coordinates are valid
function isValidSelection(coords) {
    for (var i = 0; i < coords.length; i++) {
        if (coords[i][0] < 0 || coords[i][1] < 0) {
            return false;
        }
    }
    return true;
}

Что я пытаюсь сделать? У меня есть слой с именем Color. Я хочу создать несколько слоев одинаковой ширины 75 пикселей, копируя содержимое этого слоя с помощью файла JavaScript. В моем документе активным слоем является слой с именем Color. Слой частично [не полностью] заполнен розовым цветом. Теперь, когда я запускаю этот файл, действительно создается слой с именем Segment 1, но после этого появляется диалоговое окно с предупреждением с надписью Could not complete the command because the selected layer is empty. Я знаю, в чем проблема. Я взял 75 пикселей данных слоя с крайнего левого угла слоя Color, вставил их в слой Segment 1 и создал его. Но когда цикл запускается во второй раз, он считает Segment 1 активным слоем, что на самом деле таковым не является. Поэтому я явно добавил строку:

doc.activeLayer = originalLayer;

так что при каждом запуске цикла активным слоем будет слой с именем Color. Но проблема все еще сохраняется. Где я сделал что-то не так? Я думаю, мне нужно добавить некоторые значения смещения.

что такое погружение слоя? Кроме того, вам необходимо предоставить контекст того, что делает предоставленный вами фрагмент кода, вместо того, чтобы случайным образом предлагать людям прочитать все это и понять самостоятельно. И еще, скажите, пожалуйста, что вы пытаетесь сделать?

innocent 01.06.2024 14:55

Кажется, в вашем коде нет ничего плохого. Вы используете правильный файл?

M.Riyan 01.06.2024 15:34

Ох, щелк! Наконец-то я нашел ошибку и решил ее сам. Спасибо!!!

Kabir 01.06.2024 15:34

@M.Riyan Но проблема все еще возникает, когда мой слой не полностью заполнен контентом. Я упомянул концепцию значений смещения. Вы как-нибудь можете помочь?

Kabir 01.06.2024 15:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть слой, который не заполнен полностью каким-либо содержимым, необходимо использовать пару значений смещения. Ширина и высота слоя измеряются только по его содержимому. Если размер холста составляет 1920x1080, то слой, содержащий содержимое только внутри прямоугольника в пределах четырех координат (100,100), (100,200), (300,200) и (300,100), будет иметь определенные значения layer_width и layer_height, которые вы можете измерить.

        var layerBounds = originalLayer.bounds;
        var layerX = layerBounds[0].as('px'); // X coordinate of the top-left corner of the layer
        var layerY = layerBounds[1].as('px'); // Y coordinate of the top-left corner of the layer

Здесь, в этом коде, layerX имеет значение 100 [в моем примере] и layerY тоже имеет значение 100. Теперь, чтобы найти layer_height и layer_width, я могу просто следовать вашим шагам:

        var layerWidth = layerBounds[2].as('px') - layerX; // Width of the layer in pixels
        var layerHeight = layerBounds[3].as('px') - layerY; // Height of the layer in pixels

Таким образом, теперь у нас есть значения смещения, которые можно записать как:

        var offsetX = layerX;
        var offsetY = layerY;

и код наконец меняется:

       var selectionCoords = [
                [x + offsetX, offsetY],
                [segmentRight + offsetX, offsetY],
                [segmentRight + offsetX, layerHeight + offsetY],
                [x + offsetX, layerHeight + offsetY]
       ];

Вот и все. Больше ничего не требуется.

В случае отладки мы можем использовать функцию JavaScript alert() для отладки значений.

M.Riyan 01.06.2024 16:07

Другие вопросы по теме