打印

[作品] 批量更改图片尺寸的ps脚本 ---3月29日 更新 v2.0 - 增加水印功能

用于批量更改打开的图片的尺寸的photoshop 脚本 (javascript)。

v1.0版本 (旧版不提供下载了,需要的请参考下面楼层的代码段)

操作对象:
当前打开的所有文档;
(注意不要有尚未保存过的新建的文档,或无法直接保存的文档,否则会中断批处理)

用法:
把解压出来的 “改变尺寸.jsx” 文件复制到 “ps安装目录\预置\脚本” 下,重新打开ps以后就可以在~
[菜单- 文件-脚本] 里面找到 “改变尺寸”

或者解压出来,在开着ps的情况下,直接双击也可以用。



操作结果:
直接覆盖保存并关闭文档。(最好复制一个文件夹,然后再打开图片执行这个操作,不然就没有原始文件喽)

~~~~~~~~~~ 目前只在cs3中文版上测试通过

若其他ps版本有问题,或者有什么bug还请多多反馈!谢谢!
对这个没什么研究,刚学~尚苦于没有资料,更欢迎高人多多指点

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2月23日 更新内容

v1.11版本

可以把当前文档(包括未保存过的)直接修改尺寸并保存为jpg。(注意会关闭当前文档!)
可以针对整个文件夹进行操作。(程序设定为“不包括隐藏文件”,因此不想处理和不能处理的文件可以先设置为[隐藏]属性)
可选择另存jpg 至另一个文件夹。
另存时支持文件名前后添加字符。

更新在28楼 (旧版不提供下载了,需要的请参考下面楼层的代码段)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3月2日 更新内容


v1.21 更新:
1、增添了3种另存格式:gif、psd、tiff。
2、添加了处理进度条,在大量文件处理的时候对进度掌握更好。(3月2日修正了隐藏文件导致进度条不准的bug)
3、修改了改变尺寸的算法,允许对不需要控制的尺寸留空(小于1或不填写即为留空,留空值将根据选项 不改变或者等比计算)
4、添加了about ,鸣谢了几位给于帮助的朋友

更新在54楼




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3月29日 更新内容

v2.0版本下载

v2.0 更新:
1、加了水印添加功能。
可以平铺或添加独个的水印;并可以使用ps众多的图层混合模式。
2、修正了1.2版本保存gif 格式时颜色位数错误的bug (强烈建议更新至2.0版本)

如果有朋友问:想要半透明水印怎么办?想要倾斜水印怎么办?
答:把水印文件做成半透明(保存为png或者psd 之类)和倾斜的即可,脚本界面就不另外放置参数了。

更新在61楼,请喜欢的朋友下载v2.0版本



[ 本帖最后由 wonton 于 2008-3-29 23:08 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
本帖最近评分记录
  • wonton 威望 +2 支持 2008-3-8 09:52
忘了说了,比较适合统一处理 有横有竖混在一起的照片

这是做这个脚本的初衷
好东西,支持~!
(\/)︵ ◦۩۞۩◦
(·_ _ )~GO2HERE.NET/GO2HERE.NET.CN MORE THAN MEETS THE EYE
Fireworks网页元素与网页效果图设计

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
正有一批产品图片需要处理  哎呀 就这么遇到了   么么楼主一下  
一切只能装在C盘的软件都是可耻的

努力

学学了!!

TOP

附上代码,方便大家指正

复制内容到剪贴板
代码:
#target photoshop
app.bringToFront();
// 带自动判断横竖的统一长宽操作,对当前所有打开文档进行操作。因为是直接保存关闭,原文件要注意备份!
if (app.documents.length == 0){
    alert("请打开至少一个文件");
}else{
var PRESOLUTION = 72;
app.preferences.rulerUnits = Units.PIXELS;
        
res ="dialog { \
text:'批量尺寸调整 - 直接覆盖保存-请注意备份',\
        group: Group{orientation: 'column',alignChildren:'left',\
                corrdination: Panel { orientation: 'row', \
                        text: '需要尺寸', \
                                x: Group { orientation: 'row', \
                                        s: StaticText { text:'长:' }, \
                                        e: EditText { preferredSize: [50, 20] } ,\
                                        p: StaticText { text:'pixel' }, \
                                        }, \
                                y: Group { orientation: 'row', \
                                        s: StaticText { text:'宽:' }, \
                                        e: EditText { preferredSize: [50, 20] }, \
                                        p: StaticText { text:'pixel' }, \
                                        } \
                                },  \
                        a:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'保持原图长宽比,新尺寸仅作外框限定'},\
                                }, \
                        b:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'不判断原图横竖'},\
                                }, \
                },\
        buttons: Group { orientation: 'row', alignment: 'right',\
                Btnok: Button { text:'确定', properties:{name:'ok'} }, \
                Btncancel: Button { text:'取消', properties:{name:'cancel'} } \
                } \
}";
win = new Window (res);
win.buttons.Btncancel.onClick = function () {
this.parent.parent.close();
}
win.group.a.c.onClick = function(){ //如果勾选了a,则b被锁定
        if(win.group.a.c.value){
                win.group.b.c.value=true;
        }
}
win.group.b.c.onClick = function(){
        if(win.group.a.c.value){
                win.group.b.c.value=true;
        }
}
win.buttons.Btnok.onClick = function () {
    
                var x=Number(win.group.corrdination.x.e.text);
                var y=Number(win.group.corrdination.y.e.text);
                var a=win.group.a.c.value;
                var b=win.group.b.c.value; //选中则不颠倒横竖,以输入值为准
                
                if (!b && x<y){  //确保PW>=PH
                        var PW=y
                        var PH=x
                        }else{
                        var PW=x
                        var PH=y
                        }    
    while (app.documents.length){
    var docRef = app.activeDocument; // 当前活动文档为操作对象    
                var dw = docRef.width;
                var dh = docRef.height;
                var fw = PW;
                var fh = PH;
                if(!b && dh>dw){
                    fw = PH;
                    fh = PW;
                }
                if(a){
                    w1 =dw/fw;
                    h1 =dh/fh;
                    if(w1>h1){
                        fh =dh/w1;    
                    }else{
                        fw =dw/h1;
                    }
                }
        docRef.resizeImage(fw, fh, PRESOLUTION, ResampleMethod.BICUBIC);
        docRef.save();
        docRef.close(); //关闭当前文档
}
this.parent.parent.close();
}
win.center();
win.show();
}

TOP

不错   支持下  

TOP

我汗,你怎么这么及时,春节照几百张照片各个都是3072×2304,我还正发愁如何处理呢。哈哈
web设计加群:8156919

TOP

  其实一起打开效率还是比较低的,尤其配置不好的机器~
照片方向一致的话,还是推荐大家用ps原本的“文件-脚本-图像处理器”。

有空再修改一下,今天忙 希望用过的朋友积极反馈意见!谢谢

[ 本帖最后由 xiexienila 于 2008-2-21 09:48 编辑 ]

TOP

photoshop 用到这种程度  很强 !!!

TOP

我现在每天都调好多相..楼主这个可惜我用不到...横竖太多而且颜色也得亲自调.快快来个超强的脚本吧.会自动调色和自动按横竖裁图片的吧...........哈哈.那时我就可以做着喝咖啡看着电脑调相了

TOP

  裁切和调色 都是靠人的啊,自动效果不敢想象,呵呵

TOP

一直很敬佩你哦,xiexienila

TOP

你神了


以前我是用动作来批量改大小的,结果有横有竖的,搞得好麻烦
只争朝夕

TOP

只用过PS里的动作,这脚本还是第一次用,厉害

TOP

CS3正版DVD中有4个PDF是介绍脚本的,全英文的,楼主你有吗,没有PM我我发给你,支持你再丰富这个脚本的内容。

还有CS3的套装还有一个ExtendScript Toolkit 2这个软件,是专门编写脚本的,里面有所有你安装的ADOBE的软件的函数库

[ 本帖最后由 XYBLUEIDEA 于 2008-2-21 16:48 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
技术+创意+审美+细心=设计成功的法宝

TOP

回复 #17 XYBLUEIDEA 的帖子

谢谢,都用到了,不过还是很吃力。

呵呵,现在正在用 ExtendScript Toolkit 2 写一个 重复执行任意动作的脚本,就快成功了,差一个快照~
函数库还不会用,没什么编程经验,对库感觉比较郁闷。我就拿工具当作带高亮显示的记事本 (浪费啊

现阶段就是连抄带改带蒙(今天居然叫我蒙对好几个写法

[ 本帖最后由 xiexienila 于 2008-2-21 16:51 编辑 ]

TOP

加油,毕竟现在也没有中文的脚本教程,孤军做战,挺难的。

要是有什么需要我帮助的,PM我,我尽我所能帮你
技术+创意+审美+细心=设计成功的法宝

TOP

很厉害啊。跟我平时用的微软的powertoys里的image resizer有点像,试试看

TOP

程序白痴*____*
xiexienila同志 谢谢你啦~
天行键,君子以自强不息
君子应该像天宇一样运行不息,即使颠沛流离,也不屈不挠;如果你是君子,接物度量要像大地一样,没有任何东西不能承载

TOP

一直很佩服你,用动作也可以吧,请问脚本与动作做这个批处理有什么不同吗,
我行我素!

TOP

自己不懂
友情支持
4WD

TOP

回复 #21 wndao009 的帖子

  动作无法执行判断和循环阿。 比如说我就常用动作处理图片尺寸,不过要先按照横竖,分拣成两个文件夹~

有了xiexienila 这个脚本,就方便了。不错
发帖前请搜索,回帖前请仔细看清楼上每一层。大家的批评意见要虚心接受。有错误要积极承认。 论坛的交流气氛要和谐!内容重复和无实际意义的帖子要少发。

TOP

photoshop 用到这种程度  很强 !!!

TOP

ACDSee有这个功能。呵呵

TOP

还好我电脑速度好凑合

不然就惨了 谢谢 共享
凡事有两面看好的一面

TOP

批量修改图片尺寸是有时会遇到的任务,以前都是用最笨的方法一张一张打开来改,现在有了好东东!
先下下来,回头用用。谢谢楼主分享。

TOP

经过几乎一天的折腾,终于完善了一点点功能

  看到还有不少朋友用得上,就想花点时间完善一下,没想到这么简单一个东西都这么累~~

http://www.ps-scripts.com/
不少东西都是从这里找到的,虽然都是些零散的关键字,但给进一步查找搜索[脚本指南]制造了条件。
并且由于[脚本指南]缺少例句,很多写法也都是这里搜索到的,另外就是猜测实验出来的。
终于感觉到学好英文是多么幸福啊~~~~~

由于可能的组合多了好多,测试也许不尽周全,希望大家发现问题及时反馈!
再次谢谢!!



(旧版本不提供下载了,需要的请参考楼下代码)

[ 本帖最后由 wonton 于 2008-3-3 17:02 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

希望帮忙修改一下一楼,说明楼上有更新!

复制内容到剪贴板
代码:
#target photoshop
app.bringToFront();
// 带自动判断横竖的统一长宽操作。默认是直接保存关闭,原文件要注意备份! v1.11 - 2008.2.23
var PRESOLUTION = 72;
app.preferences.rulerUnits = Units.PIXELS;
        
res ="dialog { \
text:'批量尺寸调整 ',\
        group: Group{orientation: 'column',alignChildren:'left',\
                top:StaticText{text:'默认为直接覆盖保存 - 请注意选择或做好备份',align:'left'},\
                corrdination: Panel { orientation: 'row', \
                        text: '需要尺寸', \
                                x: Group { orientation: 'row', \
                                        s: StaticText { text:'宽:' }, \
                                        e: EditText { preferredSize: [50, 20] } ,\
                                        p: StaticText { text:'px' }, \
                                        }, \
                                y: Group { orientation: 'row', \
                                        s: StaticText { text:'高:' }, \
                                        e: EditText { preferredSize: [50, 20] }, \
                                        p: StaticText { text:'px' }, \
                                        } ,\
                                }, \
                a:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'保持原图长宽比,新尺寸仅作外框限定'},\
                                }, \
                b:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'不判断原图横竖'},\
                                }, \
                now:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'对文件夹进行操作(否则处理所有目前打开的文档)'},\
                                }, \
                folderO:Group{ orientation: 'row', \
                                b: Button {text:'待处理文件夹', properties:{name:'open'} ,helpTip:'选择您需要处理的文件所在的文件夹'},\
                                s: EditText  { text:'', preferredSize: [180, 20] },\
                                },\
                other:Group{ orientation: 'row', \
                                c: Checkbox { preferredSize: [16, 16]} ,\
                                s: StaticText {text:'启用另存 (jpg格式)'},\
                                }, \
                otherSet: Panel {orientation: 'column',alignChildren:'left',\
                        text: '另存设置', \
                        Quality: Group { orientation: 'row',  \
                                    s: StaticText { text:'Jpeg压缩质量:' }, \
                                    e: EditText { preferredSize: [30, 20] ,text:'7'} ,\
                                    s: StaticText { text:'(0-12,数值越大质量越高)' }, \
                                    }, \
                        head: Group { orientation: 'row',  \
                                    s: StaticText { text:'在文件名前添加字符:' }, \
                                    e: EditText { preferredSize: [50, 20] } ,\
                                    }, \
                        foot: Group { orientation: 'row',  \
                                    s: StaticText { text:'在文件名后添加字符:' }, \
                                    e: EditText { preferredSize: [50, 20] }, \
                                    } ,\
                        otherF:Group{ orientation: 'row', \
                                    c: Checkbox { preferredSize: [16, 16]} ,\
                                    s: StaticText {text:'另存至其他文件夹'},\
                                    }, \
                        folderS:Group{ orientation: 'row', \
                                    b: Button {text:'另存至', properties:{name:'save'} ,helpTip:'选择您处理好的文件要保存至的文件夹'},\
                                    s: EditText  { text:'', preferredSize: [180, 20] },\
                                    },\
                        },\
                },\
        buttons: Group { orientation: 'row', alignment: 'right',\
                Btnok: Button { text:'确定', properties:{name:'ok'} }, \
                Btncancel: Button { text:'取消', properties:{name:'cancel'} } \
                }, \
}";
win = new Window (res);
win.buttons.Btncancel.onClick = function () {
this.parent.parent.close();
}
function lock_b(){  //如果勾选了a,则b被锁定
        if(win.group.a.c.value){
                win.group.b.c.value=true;
        }
    }
win.group.a.c.onClick =function() { lock_b()};
win.group.b.c.onClick =function() { lock_b()};
// 打开文件夹的操作
var folderOpen=win.group.folderO
var folderSave=win.group.otherSet.folderS
folderOpen.b.onClick = function() {
        var defaultFolder = folderOpen.s.text;
        var testFolder = new Folder(defaultFolder);
        if (!testFolder.exists) {
            defaultFolder = "~";
        }
        var selFolder = Folder.selectDialog("选择待处理文件夹", defaultFolder);
        if ( selFolder != null ) {
            folderOpen.s.text = selFolder.fsName;
            folderOpen.s.helpTip = selFolder.fsName.toString();
        }
}
folderSave.b.onClick = function() {
        var defaultFolder = folderSave.s.text;
        var testFolder = new Folder(defaultFolder);
        if (!testFolder.exists) {
            defaultFolder = "~";
        }
        var selFolder = Folder.selectDialog("选择要储存至的文件夹", defaultFolder);
        if ( selFolder != null ) {
            folderSave.s.text = selFolder.fsName;
            folderSave.s.helpTip = selFolder.fsName.toString();
        }
}
// 初始化选项
win.group.folderO.enabled =false;
win.group.otherSet.enabled =false;
//操作文件夹开关
win.group.now.c.onClick =function(){
    if (win.group.folderO.enabled) {
        win.group.folderO.enabled =false;
        }else{
        win.group.folderO.enabled =true;
        }
}
//另存开关
win.group.other.c.onClick =function(){
    if (win.group.otherSet.enabled) {
        win.group.otherSet.enabled =false;
        }else{
        win.group.otherSet.enabled =true;
        if (!win.group.otherSet.otherF.c.value) {win.group.otherSet.folderS.enabled =false}
        }
}
//另存至文件夹开关
win.group.otherSet.otherF.c.onClick =function(){
    if (win.group.otherSet.folderS.enabled) {
        win.group.otherSet.folderS.enabled =false;
        }else{
        win.group.otherSet.folderS.enabled =true;
        }
}
// 实际处理开始
function newsize(docRef,a,b,PW,PH){ //改变图象尺寸函数
            var dw = docRef.width;
            var dh = docRef.height;
            var fw = PW;
            var fh = PH;
            if(!b && dh>dw){
                fw = PH;
                fh = PW;
            }
            if(a){
                w1 =dw/fw;
                h1 =dh/fh;
                if(w1>h1){
                    fh =dh/w1;    
                }else{
                    fw =dw/h1;
                }
            }
    docRef.resizeImage(fw, fh, PRESOLUTION, ResampleMethod.BICUBIC);
}
function save(docRef) {    //储存函数
        if (win.group.other.c.value){ //判断是否另存
            
                docRef.flatten() ;//合并图层,以储存jpg
                docRef.changeMode(ChangeMode.RGB); // 更改为rgb模式,避免其它模式无法储存                
                var jpegOptions = new JPEGSaveOptions();
                var setquality = Number(win.group.otherSet.Quality.e.text);
                if (setquality>12) {
                    setquality=12;
                }else if (setquality<0) {
                    setquality=0;
                }
                jpegOptions.quality = setquality;
                
                // 获取另存文件夹及前后追加字段
                var headWord = win.group.otherSet.head.e.text;
                var footWord = win.group.otherSet.foot.e.text;    
                
                if (win.group.otherSet.otherF.c.value){ //如果选中另存至文件夹
                            if (win.group.otherSet.folderS.s.text){
                                var saveFolder = win.group.otherSet.folderS.s.text+"/";    
                            }else{    
                                var saveFolder = docRef.path+"/newsize_";  //容错,避免没有具体选择另存到那个文件夹
                            }
                }else{
                            if (headWord || footWord){
                                var saveFolder = docRef.path+"/";
                            }else{
                                var saveFolder = docRef.path+"/newsize_"; //容错,避免没有添加前后缀而保存在本文件夹
                            }
                }
                                
            docRef.saveAs(new File(saveFolder + headWord +docRef.name.substring(0,docRef.name.lastIndexOf('.'))  + footWord + ".jpg"),jpegOptions);    //设定输出文件名称            
        }else{
            docRef.save();
        }
        docRef.close(SaveOptions.DONOTSAVECHANGES); //关闭当前文档    
}
win.buttons.Btnok.onClick = function () {    
        var x=Number(win.group.corrdination.x.e.text);
        var y=Number(win.group.corrdination.y.e.text);
        var a=win.group.a.c.value;
        var b=win.group.b.c.value; //选中则不颠倒横竖,以输入值为准
        
        if (!b && x<y){  //确保PW>=PH
                var PW=y
                var PH=x
                }else{
                var PW=x
                var PH=y
                }    
            
        if (!win.group.now.c.value) {  // 当前活动文档为操作对象    
                while (app.documents.length){
                        var docRef = app.activeDocument;
                        newsize(docRef,a,b,PW,PH);
                        save(docRef);
                }
        }else{ // 文件夹为操作对象            
                var openFolder = Folder(win.group.folderO.s.text);                
                var fileList = openFolder.getFiles() //获取open文件夹下所有文件
                for (i=0;i<fileList.length;i++){
                    if (fileList[i] instanceof File && fileList[i].hidden == false){ //不处理隐藏文件
                        open(fileList[i]);
                        var docRef = app.activeDocument;
                        newsize(docRef,a,b,PW,PH);
                        save(docRef);
                    }
                }
        }
this.parent.parent.close();
}
win.center();
win.show();
~~~~~~~~~~~~~~~
已修改,顶楼已作说明!
------- wonton留


[ 本帖最后由 wonton 于 2008-2-23 20:03 编辑 ]

TOP

越来越强大了,大家给你提些意见你丰富下,把它做成一个居家旅行必备的脚本
技术+创意+审美+细心=设计成功的法宝

TOP