一款图片更名工具,通过拖拽排序缩略图并根据目录名称给图片命名
By
the100s
at 2021-04-24 • 0人收藏 • 1308人看过

改名工具使用环境:
目录名称需有下划线,目的用于分割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();登录后方可回帖