zoukankan      html  css  js  c++  java
  • 30分钟上手Photoshop脚本

    本文目的:

    30分钟之内让你明白如何利用Photoshop(以下简称PS)脚本编写常用插件或工具,提升工作效率。

    如果你是前端工程师或视觉设计师,强烈建议你驻足30分钟,日后为人你节约的时间,或许是30天!

     

    写在前面:

    本文非扫盲贴,如果你还不清楚脚本与动作的区别,请自行搜索

    本文使用Javascript作为PS脚本开发语言,如果你还完全不懂Javascript,请 点击

    本文中的实例测试运行环境为Photoshop CS5,如何低于该版本,可能支持不完全。

     

    PS脚本具体能干什么?

    自动导入设计稿固定头尾部;

    自动生成规定宽度的参考线;

    提取PSD中的文本内容及样式;

    自动导出ICON、按钮、切割背景图;

    等等大部分操作都可以自动完成。

    比如我已完成一个PSD2HTML插件iParser。

     

    准备工作:

    1、运行Adobe ExtendScript Toolkit(强烈推荐使用该编辑器,Adobe套装已默认安装)

    2、新建文件并粘贴以下代码。

    alert('恭喜!测试通过。');  
    

    3、保存至 Photoshop安装目录\Presets\Scripts,命名为test.jsx。

    4、运行Photoshop,选择 文件>脚本>test 执行脚本。

    如果看到了警告窗口,那你已经准备就绪。

     

    实例一:入门

    preferences.rulerUnits = Units.PIXELS;  
    var docRef = app.documents.add(200, 200);  
    var layer = docRef.artLayers.add();<br>layer.name = 'footer';  
    
     
    实例二:对话框
    如果开发为插件,我们通常需要根据用户输入的信息执行脚本,这时候我们就需要用到对话框。
    var dialogStr ="dialog { \  
        text:\ '新建模板',\  
        name:Group{\  
            label: StaticText {text:'名称:' }, \  
            input: EditText { preferredSize: [220, 20], text: 'test'} \  
        }\  
    }";  
    var win = new Window(dialogStr);  
    win.center();<br>win.show();  
    
     
    Photoshop对象模型:
    和浏览器中的文档对象模型DOM类似,Photoshop也有它的对象模型:



    常用类型与方法简介:
    [Application](app):相当于浏览器中的window,它是对象模型的根,并提供访问所有其他对象的接口。
    activeDocument[Document]:当前操作文档
    documents[Documents]:当前打开文档的集合
    preferences[Preferences]:首选项设置
    executeAction:动作管理器。当你发现你要实现的功能没有直接的API时,你可能可以用它来完成,它提供了PS低级别的访问。
    [Application]-[Document]:图层集合的容器
    artLayers:艺术图层集合(最常见的普通图层)
    layerSets:图层组集合
    layers:包括artLayers与layerSets的集合
    [Application]-[Document]-[ArtLayer]:操作最频繁的对象,访问图层信息,对图层的任何操作都能过这个对象
    bounds:获取图层边界坐标
    grouped:是否在图层组内
    linkedLayers:链接的图层
    textItem:获取图层中的文档需要通过textItem.contents
    *参考文档见附件
     
    请浏览一遍参考文档,并尝试完成一个工具:
    题目:完成一个设计稿模板
    功能点:自动导入公共头部(居顶)、生成980px的参考线、导入公共尾部(居底)
    参考方法:
    app.documents.add  
    doc[Document].guides.add  
    doc[Document].selection.select  
    doc[Document].selection.fill  
    doc[Document].selection.copy  
    layer[ArtLayer].textItem.*  
    file[File].*  
    color[SolidColor].*  
    layer[ArtLayer].move  
    
     
    常见问题解答:
    如果你已经尝试用脚本完成一些功能,可能碰到了一些问题,比如PS的文档模型似乎并没想像中的完美,参考文档不详尽,甚至存在错误,那参考一下我曾碰到过的一些问题。
    1、如何创建一个选区?
    答:doc[Document].selection.select([[x1, y1], [x1, y2], [x2, y2], [x2, y1]]);
    注:之所以把它当成一个问题,是因为文档中未提及具体参数,极易弄错。它的坐标顺序是(左上、左下、右下、右上)。
    2、如何获取选中的图层/组?
    答:这是一个学习过程中必犯的错误,你肯定会尝试doc[Document].activeLayer,但该方法只获取到当前激活的图层,并不能获取到所有选中的图层。
    正确答案-
    a、临时图层组中转(低效,低风险)。
    getSelectedLayer: function(){  
        var A=[];  
            var desc11 = new ActionDescriptor();  
                var ref9 = new ActionReference();  
                ref9.putClass( stringIDToTypeID('layerSection') );  
            desc11.putReference( charIDToTypeID('null'), ref9 );  
                var ref10 = new ActionReference();  
                ref10.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );  
            desc11.putReference( charIDToTypeID('From'), ref10 );  
            executeAction( charIDToTypeID('Mk  '), desc11, DialogModes.NO );  
        var gL = activeDocument.activeLayer.layers;  
        for(var i=0;i<gL.length;i++){   
            A.push(gL[i]);   
        }   
        executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO);  
        return A;               
    }  
    
    b、 设为链接图层中转。(高效,高风险)
    getSelectedLayer: function(){  
        var selects = [app.activeDocument.activeLayer];  
        try {  
            var idlinkSelectedLayers = stringIDToTypeID( "linkSelectedLayers" );  
            var desc929 = new ActionDescriptor();  
            var idnull = charIDToTypeID( "null" );  
            var ref617 = new ActionReference();  
            var idLyr = charIDToTypeID( "Lyr " );  
            var idOrdn = charIDToTypeID( "Ordn" );  
            var idTrgt = charIDToTypeID( "Trgt" );  
            ref617.putEnumerated( idLyr, idOrdn, idTrgt );  
            desc929.putReference( idnull, ref617 );  
            executeAction( idlinkSelectedLayers, desc929, DialogModes.NO );  
        } catch(e) {}  
        if(selects[0].linkedLayers) selects = selects.concat(selects[0].linkedLayers);  
        return selects;  
    },  
    
     *注:以上代码可能暂时不能看懂,没关系,这些低层的数据访问,实践多了慢慢就懂了。
     
    3、如何获取文本图层的颜色?
    答:如果你用[ArtLayer].textItem.color,在实践中很难正确获取的文本颜色,因为设计师很可能是选择文本填充颜色的,这个颜色值在range上。
    参考方法:
    charIDToTypeID("Txt ") - 图层的文本数据
    charIDToTypeID("Txtt") - 图层文本range数据
    具体可参考我的另一篇文章,PS脚本函数库。
    4、如何合并选中的图层?
    答:
    错误答案 - layer[ArtLayer].merge
     
    正确答案 -
    var idMrgtwo = charIDToTypeID( "Mrg2" );  
    executeAction( idMrgtwo, undefined, DialogModes.NO );  
    
     
    *面板开发(进阶)
    如果我们开发的插件是需要用户不断在文档与插件之间进行操作,对话框已经不能满足需求了,那么我们需要用到面板。
    由于面板编程涉及adobe air,可以先作大致了解,非必须掌握的内容。
    如下图:
    具体操作方式如下:
    1、使用flex/builder开发flash面板,发布成extension-name.swf文件;
    2、创建PS脚本 extension-name.jsx;
    3、将extension-name.swf、extension-name.jsx放入Photoshop安装目录\Plug-ins\Panels\extension-name
    原理:
    Photoshop作为flash面板的宿主环境,flash与PS脚本通信执行指令。
    全面的介绍需要另起篇幅,不便于多作介绍,如有兴趣,请点击
     
    学习资料:

    作者:万技师
    出处:http://www.cnblogs.com/wanbo/
    转载请在明显位置注明原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    【Leetcode】120.Triangle
    【编程珠玑】第一章位图排序
    【Python】Xml To Excel
    【Django】git建仓上传时遇到的小问题
    【C++】 网络编程 01
    2018.09.20python学习第八天
    2018.09.19python作业
    2018.09.19python学习第七天part2
    2018.09.19python学习第七天part1
    2018.09.18python学习第六天part3
  • 原文地址:https://www.cnblogs.com/wanbo/p/5763662.html
Copyright © 2011-2022 走看看