一款图片更名工具,通过拖拽排序缩略图并根据目录名称给图片命名

By the100s at 2021-04-24 • 0人收藏 • 479人看过

111.png

改名工具使用环境:

目录名称需有下划线,目的用于分割2个编号,改名工具使用前面的编号对子文件夹里面的图片改名。或许适用于下图高手产生的图片。


使用方法:

拖动如上图中的ItemPic文件夹到改名工具的窗体上即可开始,拖动排列顺序,双击删除该图片不需要被改名。

222.png

难点:

被改名文件与已有文件名称冲突解决

被抛弃文件的名称与文件夹名称前半部分编码一致,需要改掉。


缺点:

编程技术低导致性能低下,感觉自己能勉强用用吧


致谢:

感谢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();



登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
AARDIO语言QQ群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械




Loading...