Photoshop切图批处理脚本

类似Google地图的东西,整个地图尺寸很大,要在网页上用,需要切成小的碎片,Google地图的每一片是256px*256px。

目前恰好遇到了这样一个问题,手里拿到了一张很大的图,需要切成碎片,粗略算了一下,最后生成的切片大概2000张左右,如果手工一点一点的切,按10秒/张的速度,需要连续不停地切5.56个小时,擦,这不是闲得蛋疼吗?

于是乎,想到了用批处理,但这个工程又不是个简单的批处理,只有一个原图,需要把一张图切成2000张,最后感觉还是用脚本比较合适。

这种脚本在百度和谷歌里很难找,一个用PS做设计的人,难道你想让她琢磨脚本程序?搜了一番,发现还是有人写过PS的脚本,下载来参考了一下,又到Adobe官网下载了Scripts参考手册,自己也写了一个切图的脚本。

[脚本截图]

 

另外推荐一个PS脚本论坛,感觉比adobe的官方论坛还要好一些。(http://ps-scripts.com/)

脚本源代码:(参考了蓝色理想Photoshop版的一个“改变尺寸”脚本)

 

JavaScript
//激活Photoshop,设置为活动窗口
app.bringToFront();
 
var PRESOLUTION=72; 
var startRulerUnits=app.preferences.rulerUnits;
var startTypeUnits=app.preferences.typeUnits;
app.preferences.rulerUnits = Units.PIXELS;
app.preferences.typeUnits = TypeUnits.PIXELS;
 
var dialogue="dialog{\
    text:'自动切图V0.1',\
  group:Group{\
    orientation:'column',\
    alignChildren:'left',\
      process:StaticText{text:'处理进度:',bounds:[0,0,300,14]},\
    timeline:Progressbar{bounds:[0,0,300,10],minvalue:0,maxvalue:100}\
    corrdination:Panel{\
      orientation:'row',\
            text:'裁剪尺寸',\
            x:Group{\
        orientation: 'row', \
                s: StaticText { text:'宽:' }, \
                e: EditText { preferredSize: [50, 20],text:128} ,\
                p: StaticText { text:'px' }, \
            }, \
            y: Group {\
        orientation: 'row', \
                s: StaticText { text:'高:' }, \
                e: EditText { preferredSize: [50, 20],text:64}, \
                p: StaticText { text:'px' }, \
            } ,\
        }, \
    fileResource:Group{\
      orientation: 'row', \
      buttonSelect: Button{text:'待裁剪文件', properties:{name:'open'} ,helpTip:'请选择待裁剪的文件'},\
      inputText: EditText{ text:'C:/Users/wxw/Desktop/map5_5.jpg', preferredSize: [180, 20] },\
    },\
  },\
  saveFileType:Group{\
    orientation:'row', \
    s:StaticText{text:' 存储类型:'},\
    typeList:Group{\
      jpeg:RadioButton {text:'JPEG',value:true},\
      gif:RadioButton {text:'GIF'},\
      png8:RadioButton {text:'PNG-8'},\
      png24:RadioButton {text:'PNG-24'},\
    }\
  }, \
  saveAsOptions:Panel{\
    orientation: 'column',\
    alignChildren:'left',\
        text: '另存为设置', \
    Quality:Group{\
      orientation: 'row',  \
      q: StaticText { text:'压缩质量:' }, \
      e: EditText {text:'60',preferredSize: [50,20],helpTip:'范围0-100,值越大图像越好'} ,\
      color: StaticText { text:'颜色:' }, \
      select: DropDownList { alignment:'left', itemSize: [26,14] },\
      opacity:Checkbox {text:'透明',value:true,helpTip:'包含基于颜色不透明度的透明性'},\
    }, \
    filePrefix:Group{\
      orientation: 'row',  \
      s: StaticText { text:'在文件名前添加字符:' }, \
      e: EditText { preferredSize: [50,20],text:'cutCopy'} ,\
      s2: StaticText { text:'勿含非法字符' , enabled:flase }, \
    }, \
    fileSubfix: Group {\
      orientation: 'row',  \
      s: StaticText { text:'在文件名后添加字符:' }, \
      e: EditText { preferredSize: [50, 20] }, \
      s2: StaticText { text:'勿含非法字符' , enabled:flase}, \
    } ,\
    fileNameType:Group{\
      orientation: 'row',  \
      q: StaticText { text:'输出文件命名方式:' }, \
      typeList:Group{\
          single:RadioButton {text:'序列化'},\
          double:RadioButton {text:'双循环',value:true},\
        }\
    }, \
    finishProcess:Group{\
      orientation: 'row',  \
      q: StaticText { text:'处理完成后:' }, \
      c:Checkbox {text:'关闭文件',value:true},\
      c2:Checkbox {text:'显示处理时间',value:true},\
    }, \
    saveAsFolder:Group{\
      orientation: 'row', \
      buttonSelect: Button {text:'另存至', properties:{name:'save'} ,helpTip:'请选择文件要保持的目录'},\
      inputText: EditText  { text:'C:/Users/wxw/Desktop/cutCopys', preferredSize: [180, 20] },\
    },\
  },\
  tips:Panel{\
      orientation:'row',\
    alignment:'left',\
        text: '提醒', \
      s:StaticText{text:'默认保存方式为直接覆盖,请注意做好备份。'},\
  },\
  buttons:Group{\
    orientation:'row',\
    alignment:'right',\
        about:StaticText {text:'[关于程序]'},\
    Btnok: Button { text:'确定', properties:{name:'ok'} }, \
        Btncancel: Button { text:'取消', properties:{name:'cancel'} } \
    }, \
}";
 
//初始窗口对象  
var win=new Window(dialogue);
//初始保存设置
var saveFileType="JPEG";
var exportOptions=new ExportOptionsSaveForWeb();
exportOptions.format=SaveDocumentType.JPEG;
exportOptions.quality=60;
var saveFileSubFix='jpg';
var filePrefix="",fileSubfix="";
 
//选择要裁剪的文件
win.group.fileResource.buttonSelect.onClick= function(){
    var selectedFile=File.openDialog('选择待裁剪文件');
    if(selectedFile!=null){
       win.group.fileResource.inputText.text=selectedFile.fsName;
     win.group.fileResource.inputText.helpTip=selectedFile.fsName.toString();
    }
}
 
//另存为目录选择
win.saveAsOptions.saveAsFolder.buttonSelect.onClick=function(){
    var saveFolder=win.saveAsOptions.saveAsFolder;
    var defaultFolder=saveFolder.inputText.text;
  var testFolder=new Folder(defaultFolder);
  if(!testFolder.exists){
    defaultFolder="~";
  }
  var selectFolder=Folder.selectDialog("选择存储文件夹",defaultFolder);
  if(selectFolder!= null ){
      saveFolder.inputText.text=selectFolder.fsName;
    saveFolder.inputText.helpTip=selectFolder.fsName.toString();
  }
}
 
//颜色下拉选择
var colorList=[256,128,64,32,16,8,4,2];
for(var i=0,len=colorList.length;i<len;i++){
    win.saveAsOptions.Quality.select.add("item",colorList[i]);
}
win.saveAsOptions.Quality.select.items[0].selected=true;
//对象不可用
win.saveAsOptions.Quality.color.enabled=false;
win.saveAsOptions.Quality.select.enabled=false;
win.saveAsOptions.Quality.opacity.enabled=false;
 
//选择存储格式
var saveFileTypeList=win.saveFileType.typeList;
 
function toggleQuality(Options){
    //开启颜色选项
  win.saveAsOptions.Quality.color.enabled=Options.enableColor;
    win.saveAsOptions.Quality.select.enabled=Options.enableColor;
    win.saveAsOptions.Quality.opacity.enabled=Options.enableColor;
  //关闭压缩质量
  win.saveAsOptions.Quality.q.enabled=Options.enablePack;
    win.saveAsOptions.Quality.e.enabled=Options.enablePack;
}
 
function selectFileType(target){
    saveFileType=target.text;
  exportOptions=new ExportOptionsSaveForWeb();
    switch(saveFileType){
      case 'JPEG':
        toggleQuality({enableColor:false,enablePack:true});
      exportOptions.format=SaveDocumentType.JPEG;
            exportOptions.quality=win.saveAsOptions.Quality.e.text;
      saveFileSubFix='jpg';
    break;
    case 'GIF':
        toggleQuality({enableColor:true,enablePack:false});
      exportOptions.format=SaveDocumentType.COMPUSERVEGIF;
            exportOptions.colors=256;
            exportOptions.transparency=win.saveAsOptions.Quality.opacity.value;
      saveFileSubFix='gif';
    break;
    case 'PNG-8':
        toggleQuality({enableColor:true,enablePack:false});
      exportOptions.format=SaveDocumentType.PNG;
            exportOptions.colors=256;
      exportOptions.transparency=win.saveAsOptions.Quality.opacity.value;
            exportOptions.PNG8=true;
      saveFileSubFix='png';
    break;
    case 'PNG-24':
        toggleQuality({enableColor:false,enablePack:false});
      exportOptions.format=SaveDocumentType.PNG;
      exportOptions.transparency=win.saveAsOptions.Quality.opacity.value;
            exportOptions.PNG8=false;
      saveFileSubFix='png';
    break;
  }
}
//绑定文件类型选择
saveFileTypeList["jpeg"].onClick=function(){selectFileType(this);}
saveFileTypeList["gif"].onClick=function(){selectFileType(this);}
saveFileTypeList["png8"].onClick=function(){selectFileType(this);}
saveFileTypeList["png24"].onClick=function(){selectFileType(this);}
 
//生成裁剪的文件
function createCutCopy(h,w,width,height,fileName){
    //添加一个选区
    app.activeDocument.selection.select([[w*width,h*height],[(w+1)*width,h*height],[(w+1)*width,(h+1)*height],[w*width,(h+1)*height],[w*width,h*height]]);
  //剪切选区
    app.activeDocument.selection.cut();
  //创建一个新文档
    var newDoc=app.documents.add(width,height,72,fileName,NewDocumentMode.RGB,DocumentFill.TRANSPARENT);
  //粘帖当前粘帖板内容
    app.activeDocument.paste();
  //导出web所用格式
    newDoc.exportDocument(File(win.saveAsOptions.saveAsFolder.inputText.text+'/'+filePrefix+fileName+fileSubfix+'.'+saveFileSubFix),ExportType.SAVEFORWEB,exportOptions);
  //关闭文件,不保存
  newDoc.close(SaveOptions.DONOTSAVECHANGES);
}
 
//处理裁剪
function cutProcess(){
    //判断当前是否有文件已经打开
    if(app.documents.length>1){
      alert("请先关闭不需要裁剪的文件!");
    return false;
  }
    //打开要裁剪的文件
    var fileResource=File(win.group.fileResource.inputText.text);
  app.open(fileResource);
  //合并所有图层
  app.activeDocument.flatten();
  //获得文档的宽和高
  var resourceWidth=app.activeDocument.width;
  var resourceHeight=app.activeDocument.height;
  //获得裁剪的尺寸
    var cutWidth=parseInt(win.group.corrdination.x.e.text,10);
    var cutHeight=parseInt(win.group.corrdination.y.e.text,10);
  //获得可裁剪成的文件数
  var cutXNumber=Math.ceil(resourceWidth/cutWidth);
  var cutYNumber=Math.ceil(resourceHeight/cutHeight);
  var cutNumber=cutXNumber*cutYNumber;
  if(cutNumber>10){
      var confirmCutNumber=confirm("要终止程序执行吗?\r\n生成文件比较多,\r\n可能需要很长时间处理。",undefined,"停止程序执行?");
  }
  if(confirmCutNumber){return false;}
  //循环处理裁剪
  var sum=0;
  var isSingle=win.saveAsOptions.fileNameType.typeList.single.value;
  var startTime=new Date().getTime(),totalTime='';
  for(var y=0;y<cutYNumber;y++){
      for(var x=0;x<cutXNumber;x++){
        //显示处理进度
      sum=y*cutXNumber+x+1;
      //进度条
      win.group.timeline.value=Math.round(sum/cutNumber*100);
      //进度文字状态
          win.group.process.text='处理进度'+Math.round(sum/cutNumber*100)+'%,';
      win.group.process.text+='['+sum+'/'+cutNumber+'] ';
      if(isSingle){
          win.group.process.text+='文件:'+filePrefix+sum+fileSubfix+'.'+saveFileSubFix;
          createCutCopy(y,x,cutWidth,cutHeight,sum);
      }else{
          win.group.process.text+='文件:'+filePrefix+'x'+(x+1)+'y'+(y+1)+fileSubfix+'.'+saveFileSubFix;
          createCutCopy(y,x,cutWidth,cutHeight,'x'+(x+1)+'y'+(y+1));
      }
      if(sum>=cutNumber){
          //关闭文件
        if(win.saveAsOptions.finishProcess.c.value){
            app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
        }
        //显示处理时间
        if(win.saveAsOptions.finishProcess.c2.value){
            totalTime='用时:'+Math.round((new Date().getTime()-startTime)/1000)+'秒';
        }
          alert("裁剪完毕!"+totalTime);
        //关闭对话框
        win.close();
      }
    }
  }
}
 
//判断设定
function checkSetting(){
    if(!win.group.corrdination.x.e.text||win.group.corrdination.x.e.text<1){alert("请设置宽度");return false;}
  if(!win.group.corrdination.y.e.text||win.group.corrdination.y.e.text<1){alert("请设置高度");return false;}
 
  if(!win.group.fileResource.inputText.text){alert("请选择待裁剪文件");return false;}
  if(!File(win.group.fileResource.inputText.text).exists){alert("文件不存在!");return false;}
 
  if(!win.saveAsOptions.saveAsFolder.inputText.text){alert("请选择存储目录");return false;}
  if(!Folder(win.saveAsOptions.saveAsFolder.inputText.text).exists){alert("目录不存在!");return false;}
 
  if(saveFileType=="JPEG"){
      if(!win.saveAsOptions.Quality.e.text){
        alert("请设置压缩质量");
      return false;
    }
    if(win.saveAsOptions.Quality.e.text<1||win.saveAsOptions.Quality.e.text>100){
        alert("压缩质量参数错误!");
      return false;
    }
  }
 
  //文件名前后缀
  filePrefix=win.saveAsOptions.filePrefix.e.text;
    fileSubfix=win.saveAsOptions.fileSubfix.e.text;
  //alert(win.group.corrdination.x.e.text);  
  //alert("checkOk");
  cutProcess();
}
 
//确定按钮
win.buttons.Btnok.onClick=function(){
  checkSetting();
}
//取消按钮
win.buttons.Btncancel.onClick=function(){
  app.preferences.rulerUnits=startRulerUnits;
  app.preferences.typeUnits=startTypeUnits;
  this.parent.parent.close();
}
//关于
win.buttons.about.onClick=function(){
    alert("自动切图专用工具V1.0\r\n Power By:www.wxwdesign.com \r\n 流水涵清","About");
}
 
//窗口居中
win.center();
//显示窗口
win.show();

WordPress编辑器贴代码真蛋疼,不太好用,还不如UBB好用,拿到IDE里格式化一下就好了。

回复 (5)

  1. 12:37 下午, 2011年09月7日百毒博客  / 回复

    你这个是放东哥的ftm02吧,速度可以啊,不慢。

    • 2:03 下午, 2011年09月7日design  / 回复

      还可以,平均访问时间2秒,慢的时候8秒

  2. 2:47 下午, 2011年05月7日design  / 回复


    design:


    前端开发-武方博:

    哥 你真是太神了 没切图切的手疼 写js手疼不 哈哈

    程序的NB的地方是它只让疼一次,而纯手工切,让你切一次疼一次:)

    当然前提是图片量足够多,一个操作流程重复50遍以上,如果人工需要半小时以上,用程序只需几分钟。

  3. 2:45 下午, 2011年05月7日design  / 回复


    前端开发-武方博:

    哥 你真是太神了 没切图切的手疼 写js手疼不 哈哈

    程序的NB的地方是它只让疼一次,而纯手工切,让你切一次疼一次:)

  4. 3:23 下午, 2011年05月5日前端开发-武方博  / 回复

    哥 你真是太神了 没切图切的手疼 写js手疼不 哈哈

发表评论

允许使用的标签 - 您可以在评论中使用如下的 HTML 标签以及属性。

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">