一款图片更名工具,通过拖拽排序缩略图并根据目录名称给图片命名
By
the100s
at 2021-04-24 • 0人收藏 • 1174人看过
改名工具使用环境:
目录名称需有下划线,目的用于分割2个编号,改名工具使用前面的编号对子文件夹里面的图片改名。或许适用于下图高手产生的图片。
使用方法:
拖动如上图中的ItemPic文件夹到改名工具的窗体上即可开始,拖动排列顺序,双击删除该图片不需要被改名。
难点:
被改名文件与已有文件名称冲突解决
被抛弃文件的名称与文件夹名称前半部分编码一致,需要改掉。
缺点:
编程技术低导致性能低下,感觉自己能勉强用用吧
致谢:
感谢Aardio群里的大佬们,特别是console.log("":("、每天进步一点点点点和万物皆table,没有他们的技术支持,这工具简直码不下去。
还有感谢Aardio论坛的大佬们留下的例子,取之开源用之开源。
import win.ui; import fsys; import gdip; //import console; import process.popen; /*DSG{{*/ var winform = win.form(text="改图片名工具";right=779;bottom=664) winform.add( button={cls="button";text="应用更改";left=600;top=616;right=768;bottom=656;color=16711680;font=LOGFONT(h=-16);z=1}; next={cls="button";text="跳过一次";left=488;top=616;right=592;bottom=656;color=16711680;font=LOGFONT(h=-16);z=2}; picname={cls="static";text="图片名自动按目录名改";left=88;top=616;right=280;bottom=656;color=255;font=LOGFONT(h=-16);transparent=1;z=4}; reload1={cls="button";text="本次重新";left=384;top=616;right=488;bottom=656;color=16711680;font=LOGFONT(h=-16);z=5}; static={cls="static";text="图片名:";left=16;top=616;right=96;bottom=656;font=LOGFONT(h=-20);transparent=1;z=3}; static2={cls="static";text="缩略图";left=272;top=624;right=328;bottom=648;font=LOGFONT(h=-16);transparent=1;z=7}; zip={cls="edit";text="0.1";left=344;top=624;right=376;bottom=648;edge=1;z=6} ) /*}}*/ import fsys.config; config = ..fsys.config( ..fsys.getSpecial( 0x1c /*_CSIDL_LOCAL_APPDATA*/ ,"/picrename/" ) ); //io.open() //将窗口控件绑定到配置文件 config.mainForm winform.bindConfig( config.winform,{ edit = "text"; } ); //主体代码来自http://bbs.aardio.com/forum.php?mod=viewthread&tid=22487&highlight=plus var swap1,swap2,f1,f2,plusctrl1,t /* swap1,swap2存互相拖动的两个plus的text值。 f1,f2,存互相拖动的两个plus的背景值 文件列表存每一个子目录里所有的文件名称,键值对,格式大致如 tab={[pic1.jpg]="c:/a/b/c/pic1.jpg"} 失败:保存改名失败的文件,暂时没什么用到。 */ var 文件列表 var 失败={} /* sss为缩略图质量0.1-0.9,越低加载图片就越快但也越模糊 */ var sss=tonumber(winform.zip.text) if(sss<0){ sss=0.1 }elseif(sss>1){ sss=0.9 } //setFont(point=10;name="宋体") var goods ={ cls="plus";/*text="goo";*/left=10;top=10;right=148;bottom=125; color=8388736;default=1;font=LOGFONT(name='微软雅黑';h=-19;weight=100;point=10;);notify=1;repeat="scale";valign="bottom"; /* 拖动互换背景和text功能: 按下左键,记忆背景和text属性,当弹起左键时,取目标plus的背景和text,并交换。 */ onMouseDown = function(wParam,lParam){ var x,y = win.getMessagePos(lParam); swap1=owner.text; plusctrl1=owner; f1=owner.getBackground(); }//end of onMouseUp onMouseDoubuleClick = function(wParam,lParam){ owner.background=0xFFFFFFFF owner.text=null } onMouseUp = function(wParam,lParam){ var x,y = win.getMessagePos(lParam); //owner.msgbox("拖动" + swap1 + "到 " +owner.text +"并互换背景"); f2=owner.getBackground(); owner.background=f1 plusctrl1.background=f2 plusctrl1.text=owner.text //交换名称 //防止txt残留 if(owner.background=null){ owner.text=null }else { owner.text=swap1 } }//end of onMouseUp } //io.open(); //产生20个图片plus控件 var num = 5; for(i=1;4){ for(n=1;num){ var plusname ="goods"++(i-1)*num+n ; goods2 = table.clone(goods); goods2.top = (i-1)*(5+150)+10; goods2.left= (n-1)*(150+5)+10; goods2.z=(i-1)*num+n; goods2.bottom=(i-1)*(5+150)+150 goods2.right=(n-1)*(150+5)+150 //goods2.text=plusname; winform.add( [plusname]=goods2; ); /* winform[plusname].skin({ color={ active=0xFF65FF00; default=0xFF0065FF; hover=0xFFFF9A00 }; scale ={ active=1.5; //放大130% //hover=1.5; //放大150% default=1;//默认缩小60% }; })//skin */ } } //给每一个plus填充背景图 var fillplus=function(tabin){ //填充plus控件,参数是包含多个图片的数组 var ut=#tabin //table参数,存放多个图片全路径tabin:{"c:\pic.jpg";"c:\pic2.jpg"。。。} n2=1 for(i=1;20;1){ winform["goods"+i].background=null winform["goods"+i].text=null } for(j=1;20;1){ //20个plus方框 if(ut>=j){ ext1=fsys.getExtensionName(tabin[j]) if(ext1 and ext1="jpg" or ext1="jpeg" or ext1="png" or ext1="gif"){ t=gdip.image(tabin[tabin[j]]).getThumbnail(sss,sss) //tabin[tabin[j]]="c:\pic.jpg" var t2=t.saveToBuffer() t.dispose(); //释放图片,释放方可改名 winform["goods"+n2].background=t2; winform["goods"+n2].text=tabin[j]//tabin[tabin[j]] //text="c:\pic.jpg" n2=n2+1 } } } do{ //等待拖动改变位置 if(!win.delay(0)){break ;}//不卡界面,来自论坛代码 if(winform.button.text="改名中"){ winform.button.text="应用更改" winform.button.disabled=true; break; } //如果本批次图片已经改名过,可以按跳过按钮 if(winform.next.text="next"){ winform.next.text="跳过" break; } if(winform.reload1.text="reload"){ //取缩略图质量,重新填充缩略图,有时候双击错删了不该删的图,可以用此功能 sss=tonumber(winform.zip.text) if(sss<0){ sss=0.1 }elseif(sss>1){ sss=0.9 } n2=1 for(i=1;20;1){ winform["goods"+i].background=null winform["goods"+i].text=null } for(j=1;20;1){ //20个plus方框 if(ut>=j){ ext1=fsys.getExtensionName(tabin[j]) if(ext1 and ext1="jpg" or ext1="jpeg" or ext1="png" or ext1="gif"){ t=gdip.image(tabin[tabin[j]]).getThumbnail(sss,sss) //tabin[tabin[j]]="c:\pic.jpg" var t2=t.saveToBuffer() t.dispose(); //释放图片,释放方可改名 winform["goods"+n2].background=t2; winform["goods"+n2].text=tabin[j]//tabin[tabin[j]] //text="c:\pic.jpg" n2=n2+1 } } } winform.reload1.text="本次重新" } }while(true) } //////////////////////////++++++++++++++ //排序功能,对已经改名过的图片们,再次被拉入想重新改名时排序显示。 //排序前pic_1.jpg pic_10.jpg pic_2.jpg pic_3.jpg //排序后pic_1.jpg pic_2.jpg pic_3.jpg pic_10.jpg comProc = function(b) begin o2=tonumber(string.split(owner,"_")[2]) b2=tonumber(string.split(b,"_")[2]) // io.print("o2,b2",o2,b2) if(o2=null){ return false; }elseif(b2=null){ return true; } return o2 < b2; end; /////////////////////////+++++++++++++++ //处理被拉入的总文件夹,*ItemPic*,遍历里面的每一个子文件夹 var dealpath2=function(pin){ a,b,c=fsys.list(pin) if(#a>0){ table.sort(a,comProc) 文件列表=a fillplus(a) }elseif(#b>0){ for(i=1;#b;1){ a=fsys.list(b[b[i]]) if(#a>0){ table.sort(a,comProc) 文件列表=a winform.button.disabled=false; fillplus(a) } } } } //窗体接受拖入 winform.onDropFiles = function(files){ winform.button.disabled=false; var path = table.shift(files); if(!path) return; dealpath2(path) winform.button.disabled=true; } ///////////////////////////////////////// //改名:p全路径,e新名 dorename = function( p,e ){ var prcs = process.popen.cmd(string.format("rename ""%s"" %s", p,e)) if(string.indexOf(prcs.readErr(-1),"存在")){ doublerename(p,e,"tempn"+string.random(2)) }else { } prcs.close() } //改冲突名:p全路径,e新名,临时字符串 doublerename=function(p,e,tmp){ //p=d:/a/b/c/a.jpg //e=b.jpg //tmp=tmp.jpg //put d:/a/b/c/b.jpg --> d:/a/b/c/b tmp.jpg & put d:/a/b/c/a.jpg -->d:/a/b/c/b.jpg var 旧全名=p //d:/a/b/c/a.jpg var 父目录全名= fsys.getParentDir(p) //d:/a/b/c/ var 已存在冲突全名=父目录全名++e //d:/a/b/c/b.jpg var 冲突名改成=tmp ++ e var prcs = process.popen.cmd(string.format("rename ""%s"" %s", 已存在冲突全名,冲突名改成)) if(string.indexOf(prcs.readErr(-1),"存在")){ table.push(失败,{已存在冲突全名;冲突名改成}) }else { 文件列表[e]=父目录全名++冲突名改成 prcs = process.popen.cmd(string.format("rename ""%s"" %s", p,e)) if(string.indexOf(prcs.readErr(-1),"存在")){ table.push(失败,{p;e}) } } prcs.close() } //改名前的分析:p全路径,n是pic_1.jpg后面的1 var rename=function(p,n){ if(p=null){ //console.log("rename p is null ,exit") return false; } var 旧全名=p //d:/a/b/c/a.jpg var 旧名=fsys.getFileName(p) //a.jpg var ext=fsys.getExtensionName(旧名) //string.split(旧名,".")[2] var 父目录全名= fsys.getParentDir(p) //d:/a/b/c/ var 父目录名=fsys.getFileName(父目录全名) //c if(!父目录名){ return false; //加不加 } //分割目录 var 新名1=string.split(父目录名,"_")[1] var 新名=新名1 ++"_"++ n ++"." ++ext //winform.picname.text=新名1 ++ "_"++ n var 新全名=父目录全名++新名 dorename(旧全名,新名) return true; } //剩余文件的另外处理,防止他们的文件名与文件夹名称前半部分编码一致。 var leftrename=function(){ for k,v in 文件列表 if(v and v!=""){ ext1=fsys.getExtensionName(k) if(ext1 and ext1="jpg" or ext1="jpeg" or ext1="png" or ext1="gif"){ var 父目录全名= fsys.getParentDir(v) //d:/a/b/c/ var 父目录名=fsys.getFileName(父目录全名) //c var 新名1=string.split(父目录名,"_")[1] var 旧名1=string.split(k,"_")[1] //a.jpg if(新名1=旧名1){ //console.log("不被更名的图片名与目录名一致,改掉") dorename(v,string.random(5)++"."++ext1) } }//if ext1 }//if v } winform.button.oncommand = function(id,event){ winform.button.text="改名中" //console.clearScreen() var n2=0 for(j=1;20;1){ pp=winform["goods"+j].text if(pp){ if(rename(文件列表[[pp]],n2)){ n2=n2+1 文件列表[pp]="" } } } leftrename() } winform.next.oncommand = function(id,event){ winform.next.text="next" } winform.reload1.oncommand = function(id,event){ winform.reload1.text="reload" } winform.show(); win.loopMessage();
登录后方可回帖