`

Photoshop切图批处理脚本

 
阅读更多
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



类似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<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里格式化一下就好了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics