在photoshop中获取切片的参数

时间:2010-11-15 17:09:48

标签: javascript scripting photoshop

我的photoshop文档中有一些切片。

如何通过javascript>获取他们的参数(宽度,高度,x偏移,y偏移,名称,网址,...)在photoshop中编写脚本?

4 个答案:

答案 0 :(得分:2)

@SublimeYe,我也有同样的任务,到目前为止,还没有可用的解决方案。 javascript中的Adobe Scripting无法查看应用程序模型以获取对切片的访问权限。因此,在我自己的一些研究之后,我发现的最佳解决方案由Trevor Morris(http://morris-photographics.com/photoshop/scripts/index.html)呈现给我。我们向Trevor支付了大约500美元+来编写一个使用“切片”图层组的脚本,并且每个图层组合都有一个相应的形状图层。 javascript可以看到组,图层和形状图层,因此脚本可以很好地裁剪和保存。缺点是您无法使用切片工具,因此我们的设计团队对此脚本的采用很少。

多年来仍然遇到这个问题后,我最近再次尝试搜索此adobe论坛http://feedback.photoshop.com/photoshop_family/topics/slice_compositions_that_work_like_layer_compositions以及Enzo http://www.electriciris.com/slicemaster.html对此SliceMaster工具的链接。此工具允许每个文档有多个切片,这些切片作为切片集存储在图层中。我的任务是使用Layer Slice集自动化Layer Comps,我认为这与你的非常相似。我向恩佐提出一个问题,看看他是否可以写或计划编写这种自动化。

我认为你想要做的唯一方法是使用用C ++代码编写的Adobe Photoshop SDK插件,而不是javascript中的脚本。我刚刚下载了SDK,我正在查看C ++代码,看看是否可以制作解决方案。

但是,我希望Enzo可以提供解决方案,因为他已经是Photoshop SDK开发人员了......敬请关注!

答案 1 :(得分:1)

经过我的研究。我找到了一种通过脚本获取切片信息的简单方法。

正如您所知,没有直接的方式来访问切片作为选择。

但是当你用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信息了!

现在我们开始添加一个事件Listener(这里我使用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,我们可以获得该描述符的任何信息! 我努力了!

答案 2 :(得分:0)

使用裁剪和切片工具集下的切片选择工具。您可以通过在工具栏中选择它来手动选择它,或者当将鼠标悬停在您创建的切片上时,它会自动显示给您。

当鼠标悬停在先前创建的切片上时,通过按住CMD(在Windows中为Ctrl)也可以激活它。

然后双击切片,将打开一个对话框窗口,为您提供该切片的所有必要信息。

快乐的切片!

答案 3 :(得分:0)

多年来,我一直在探索这个任务。我终于创造了一个接近完美的解决方案。唯一的缺点是它需要在Fireworks中打开你的PSD。有点跛,我知道。将它们从photoshop中保存起来会好得多,但我不相信它是可能的。 Take是代码并将其另存为.jsf文件。然后用烟花中的切片打开你的PSD。转到命令>运行脚本...并选择您的.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);