Получить параметры срезов в фотошопе - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть несколько фрагментов в документе Photoshop.

Как я могу получить их параметры (ширина, высота, смещение по оси X, смещение по оси Y, имя, URL, ...) с помощью сценариев JavaScript в Photoshop?

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

@ SublimeYe, у меня тоже есть тот же квест, и до сих пор не было никакого доступного решения. Adobe Scripting в javascript не имеет возможности взглянуть на модель приложения, чтобы получить доступ к слайсам. Итак, после некоторых моих собственных исследований лучшее решение, которое я нашел, было представлено мне Тревором Моррисом (http://morris -photographics.com / photoshop / scripts / index.html). Мы заплатили Тревору около $ 500 + за написание сценария, в котором используется группа слоев «Срезы», и для каждого слоя Comp существует соответствующий слой Shape. Javascript может видеть группы, слои и слои фигур, чтобы скрипт мог обрезать и сохранять для веб-страниц. Недостатком является то, что вы не можете использовать инструмент для нарезки, поэтому принятие этого сценария было минимальным для нашей команды разработчиков.

После долгих лет этой проблемы я недавно попытался снова найти этот форум Adobe http://feedback.photoshop.com/photoshop_family/topics/slice_compositions_that_work_like_layer_compositions и ссылку на этот инструмент SliceMaster от Enzo http://www.electriciris.com/slicemaster.html. Этот инструмент позволяет использовать несколько фрагментов в документе которые хранятся в виде наборов срезов в слоях. Мой квест теперь состоит в том, чтобы автоматизировать Layer Comps с помощью наборов Layer Slice, которые, я думаю, очень похожи на ваши. У меня вопрос к Энцо, чтобы узнать, может ли он написать или планирует написать эту автоматизацию.

Я думаю, что единственный способ получить то, что вы хотите сделать, это использовать плагин Adobe Photoshop SDK, написанный на коде C ++, а не Script в javascript. Я только что загрузил SDK, и я смотрю на коды C ++, чтобы посмотреть, можно ли найти решение.

Однако я надеюсь, что Энцо сможет найти решение, поскольку он уже является разработчиком Photoshop SDK ... следите за обновлениями!

1 голос
/ 09 ноября 2013

После моих исследований на раз. Я нашел простой способ получить информацию о срезе по сценарию.

Как вы выяснили, нет прямого способа получить доступ к срезу как к выделению.

Но когда вы разрезаете область в ps, она отправляет событие!

Итак, вы можете добавить прослушиватель событий к этому событию, а в обработчике событий вы можете получить ActionDescriptor, а когда вы получите ActionDescriptor, вы получите все!

Если вы установили ScriptListener, вы можете найти ActionDescriptor, как показано ниже:

var idMk = charIDToTypeID( "Mk  " );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
    var ref1 = new ActionReference();
    var idslice = stringIDToTypeID( "slice" );
    ref1.putClass( idslice );
desc2.putReference( idnull, ref1 );
var idUsng = charIDToTypeID( "Usng" );
    var desc3 = new ActionDescriptor();
    var idType = charIDToTypeID( "Type" );
    var idsliceType = stringIDToTypeID( "sliceType" );
    var iduser = stringIDToTypeID( "user" );
    desc3.putEnumerated( idType, idsliceType, iduser );
    var idAt = charIDToTypeID( "At  " );
        var desc4 = new ActionDescriptor();
        var idTop = charIDToTypeID( "Top " );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc4.putUnitDouble( idTop, idPxl, 83.000000 );
        var idLeft = charIDToTypeID( "Left" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc4.putUnitDouble( idLeft, idPxl, 229.000000 );
        var idBtom = charIDToTypeID( "Btom" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc4.putUnitDouble( idBtom, idPxl, 144.000000 );
        var idRght = charIDToTypeID( "Rght" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc4.putUnitDouble( idRght, idPxl, 327.000000 );
    var idRctn = charIDToTypeID( "Rctn" );
    desc3.putObject( idAt, idRctn, desc4 );
var idslice = stringIDToTypeID( "slice" );
desc2.putObject( idUsng, idslice, desc3 );
executeAction( idMk, desc2, DialogModes.NO );

Итак, если бы мы могли получить этот ActionDescriptor, мы могли бы получить информацию о Rectangle!

Теперь мы начнем с добавления прослушивателя событий (здесь я использую ExtendScript, также доступный в javascript)

private const MK_INT:int = Photoshop.app.charIDToTypeID("Mk  ");    // event name
CSXSInterface.instance.evalScript("PhotoshopRegisterEvent", MK_INT);  // add event listener
ExternalInterface.addCallback("PhotoshopCallback" + CSXSInterface.getInstance().getExtensionId(), myPhotoshopCallback);   // event handler

тогда делаем в обработчике событий:

private function myPhotoshopCallback(eventID:Number, descID:Number):void {
var desc2:ActionDescriptor = new ActionDescriptor();
    desc2.fromID(descID);
    // there ! we got the ActionDescriptor!
    // now we need to filter the event
    if (eventID == MK_INT) {
         var idUsng:Number = Photoshop.app.charIDToTypeID( "Usng" );
     var classID:Number = desc2.getObjectType(idUsng);
     if (classID == Photoshop.app.stringIDToTypeID("slice")) {
    var desc3:ActionDescriptor = desc2.getObjectValue(idUsng);
    var idAt:Number = Photoshop.app.charIDToTypeID("At  ");
    var idRctn:Number = Photoshop.app.charIDToTypeID( "Rctn" );
    if (idRctn == desc3.getObjectType(idAt)) {
        var desc4:ActionDescriptor = desc3.getObjectValue(idAt);
        var idTop:Number = Photoshop.app.charIDToTypeID( "Top " );
        var idLeft:Number = Photoshop.app.charIDToTypeID( "Left" );
        var idBtom:Number = Photoshop.app.charIDToTypeID( "Btom" );
        var idRght:Number = Photoshop.app.charIDToTypeID( "Rght" );
        trace("top: " + desc4.getUnitDoubleValue(idTop));
        trace("left: " + desc4.getUnitDoubleValue(idLeft));
        trace("bottom: " + desc4.getUnitDoubleValue(idBtom));
        trace("right: " + desc4.getUnitDoubleValue(idRght));
    }

    }
    }
}

Как видите, мы получаем ActionDescriptor, мы можем получить любую информацию об этом дескрипторе! Я пытался и работал!

0 голосов
/ 26 марта 2014

Я тоже был в этом квесте годами.Я наконец-то создал решение, которое почти идеально.Единственным недостатком является то, что он требует открытия PSD в Fireworks.Вроде хромает, я знаю.Было бы гораздо лучше просто спасти их от фотошопа, но я не верю, что это возможно.Возьмите код и сохраните его как файл .jsf.Затем откройте свой PSD с кусочками фейерверка.Перейдите в Commands> Run Script ... и выберите свой файл .jsf.Он должен сохранить всю информацию о ваших срезах в текстовом файле в выбранной вами папке.Надеюсь, это кому-нибудь поможет.

var curDoc = fw.getDocumentDOM();
var slices = curDoc.layers[curDoc.layers.length-1].elems;
var result = "";
for (curSliceNum = slices.length-1; curSliceNum >= 0; curSliceNum--) {
        var slice = slices[curSliceNum]
        result += slice.baseName + "\r\n";
        result += "W: "+slice.width+", H: "+slice.height + "\r\n";
        result += "X: "+slice.pixelRect.left+", Y: "+slice.pixelRect.top + "\r\n";
        result += "---------------------------\r\n"; 
 }

// Saves text to the specified file
function saveText(fileURL, text){

    // Delete any existing file with the same name. If
    // you do not, and then open the file for rewriting,
    // saved text will be written over the existing file
    // which could leave remnants of the old file behind
    if (Files.deleteFileIfExisting(fileURL)){

        // Create a new file to write in. Note:
        // this is only required for Macs; Windows
        // will create a file with the call to open()
        if (Files.createFile(fileURL, ".txt", "TEXT")){

            // Open the file for writing. If successful, this
            // will return a reference to the file so that
            // text can be added to it using the write()
            // command.  
            var fileReference = Files.open(fileURL, true);
            if (fileReference){

                // Write the text to the opened file
                fileReference.write(text);

                // When finished, be sure to close the
                // file using the close() command so other
                // processes will be able to access it
                fileReference.close();

                // Returning true signals a successful save
                return true;
            }
        }
    }

    // Returning false signals a failed save
    return false;
}

var fileForSave = fw.browseForFolderURL();
saveText(fileForSave+"/coords.txt", result);
0 голосов
/ 31 марта 2011

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

Он также активируется удержанием CMD (Ctrl в Windows) при наведении курсора на ранее созданный фрагмент.

Затем дважды щелкните по срезу, и откроется диалоговое окно, содержащее всю необходимую информацию для этого среза.

Удачной нарезки!

...