有时候我们从网上下载图片时图片文件名不是有序的。
本程序使用python tkinter结合Pillow模块修改图片的名称,将图片从1开始编号,便于后续处理。
#图片批量数字化重命名,并可以循环查看所有图片
#使用时输入图片所在的文件夹路径,如E:\python作业2\resource
import os
from tkinter import *
from tkinter.ttk import *#tkinter样式
from tkinter.filedialog import askopenfilenames
from tkinter.messagebox import showinfo
from PIL import Image,ImageTk
win=Tk()#创建窗口
win.title('图片批量数字化重命名——循环查看')
# win.geometry('500x300')
label1=Label(win,text='输入图片所在绝对路径:')#父级容器为整个窗口
label1.grid(row=0,column=0)#放在0行0列,使用grid为tkinter 网格化布局
entry1=Entry(win)#输入框
entry1.grid(row=0,column=1)#将输入框放在0行1列
img_count=1
current=0
input_path=entry1.get()
if input_path!='':
all_img_files=os.listdir(input_path)#存放所有图片,便于图片切换
def showImg():
#获取所有图片文件
#input_path=entry1.get()
global input_path
print('input_path:',input_path)
img_files=os.listdir(input_path)
print('img_files:',img_files)
global img_count
img_count=len(img_files)#图片数量
print('img_count:',img_count)
global current
current=1#当前图片
label3=Label(win,text='第 '+str(current)+' 张图片')
label3.grid(row=3,columnspan=2)
#这里选择第一张显示
print('img0:',img_files[0])
img=Image.open(input_path+'\\'+img_files[0])
img=ImageTk.PhotoImage(img)
box=Frame(win)#图片外面加个框
box.grid(row=4,columnspan=2)
label4=Label(box,image=img)#父级容器为box
label4.grid(row=0,columnspan=2)#
btnup=Button(box,text="上一张", command=up,arg=label4)#点击触发up函数
btndown=Button(box,text="下一张", command=down,arg=label4)
btnup.grid(row=1, column=0)
btndown.grid(row=1, column=1)
#重命名并显示图片
def renameToShow():
path=entry1.get()#获取用户输入的路径
print('path:',path)
if os.path.isdir(path):
dirs=os.listdir(path)#获取文件夹下的所有文件,返回列表
print('dirs:',dirs)
# all_files=os.path.basename(path)#路径下的所有文件名
img_files=[]#带路径将图片添加进去
for i in dirs:#目录的话掠过
if os.path.isdir(path+'/'+i):#判断是否是目录
continue
else:
if i.endswith(('.jpg','.png','.gif','.bmp','.jpeg')):#判断是否是图片
img_files.append(os.path.join(path,i))
else:#不是图片
continue
print('img_files:',img_files)
#这里由于之前48行写错,我还以为是路径的问题
#输出:E:\\python作业2\\resource\\0f64ddaa35975a4ccea2cea549f42f28.jpeg
#转换为绝对路径
# print('abspath0:',os.path.abspath(img_files[0]))
# for p in range(len(img_files)):
# img_files[p]=os.path.abspath(img_files[p])
# print('abspath:',img_files[0])
# print('abs:',img_files)
if len(img_files)==0:
showinfo('提示','该路径下无图片')
else:
try:
for n,r in enumerate(img_files):
fname=os.path.basename(r)#获取文件名
new_name=str(n+1)+'.'+os.path.basename(fname).split('.')[1]#重命名
newname=path+'/'+new_name#新的路径
#os.rename(os.path.basename(fname),newname)#从1开始命名
if os.path.basename(r)==os.path.basename(new_name):
#print('不能重复命名!')#看不到
#showinfo('提示','不能重复命名!')#能看到提示,但点死你
continue
os.rename(r,newname)#从1开始命名,这里源文件名必须加路径,否则报找不到指定文件的错误
except Exception as e:
print('重命名失败!',e)
else:
showinfo('提示','重命名成功!')
#重命名完后显示图片
# showImg()
finally:
pass
def up(label4):
global img_count
global current
global input_path
current+=1
if current>img_count:
current=1
img = Image.open(input_path+'\\'+all_img_files[current])
img = ImageTk.PhotoImage(img)
label4.config(image=img)
label4.image = img
def down(label4):
global img_count
global current
global input_path
current-=1
if current<1:
current=img_count
img = Image.open(input_path+'\\'+all_img_files[current])
img = ImageTk.PhotoImage(img)
label4.config(image=img)
label4.image = img
btn_ok=Button(win,text='确定',command=renameToShow)
btn_ok.grid(row=1,columnspan=2)
label2=Label(win,text='查看图片')
label2.grid(row=2,columnspan=2)#合并两列
win.mainloop()#显示窗口
最后实现的半成品如下:
本来是想实现命名成功后像之前的图片切换一样显示的,后来,试了一下,代码太乱,放弃了。最终只留下批量命名的功能。很多遇到的问题我也写在代码注释里面了,当时记录的比较方便嘛!