我的photoshop文档中有一些切片。
如何通过javascript>获取他们的参数(宽度,高度,x偏移,y偏移,名称,网址,...)在photoshop中编写脚本?
答案 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)
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);