Photoshop切图批处理脚本

[url]http://www.wxwdesign.com/archives/photoshop%E5%88%87%E5%9B%BE%E6%89%B9%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC[/url]


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

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

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

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


[脚本截图]



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

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



//激活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 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 for(var x=0;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里格式化一下就好了。

你可能感兴趣的:(游戏开发,开发技术,工作应用,AS3收集)