在命令行使用PIP安装库:
pip install pillow
按下win+R,弹出界面输入cmd回车,然后输入上面命令等待安装完成即可
直接上代码:
加了两个功能:拼接图片 和 分割图片
拼接图片暂时只能拼接两个大小相同的图片
分割图片 可以生成 四宫格 和 九宫格的图片
#图片处理.py
from PIL import Image
def yasuo(way):
x, y = im.size
a = eval(input("请输入想要缩小的倍数(0-1):"))
if 0 < a <= 1:
b = 1/a
im.thumbnail((x//b, y//b))
way1 = way[:-5] + '1' + way[-5:]
im.save(way1)
print("缩小后的尺寸:{}".format(im.size))
print("图片已保存:{}".format(way1))
else:
print("错误!请输入0-1之间的数字!")
yasuo(way)
return(way1)
def xuanzhuan(way):
q = input("请选择:\n[0]逆时针旋转 [1]左右翻转 [2]上下翻转\n")
if q == '0':
q1 = abs(eval(input("请输入旋转角度:")))
im1 = im.rotate(q1)
way2 = way[:-5] + '2' + way[-5:]
im1.save(way2)
print("旋转{}度图片已保存:{}".format(q1,way2))
elif q == '1':
im1 = im.transpose(Image.FLIP_LEFT_RIGHT)
way2 = way[:-5] + '3' + way[-5:]
im1.save(way2)
print("左右翻转图片已保存:{}".format(way2))
elif q == '2':
im1 = im.transpose(Image.FLIP_TOP_BOTTOM)
way2 = way[:-5] + '4' + way[-5:]
im1.save(way2)
print("上下翻转图片已保存:{}".format(way2))
else:
print("输入错误!")
xuanzhuan(way)
return(way2)
def pinjie(way):
way_p =Image.open(input("请输入要拼接图片路径:"))
x, y = im.size
target = Image.new('RGB', (x * 2, y * 1))
a = 0
a1 = x # 图片距离左边的大小
b = b1 = 0 # 图片距离上边的大小
c = x
c1 = x*2 # 图片距离左边的大小 + 图片自身宽度
d = d1 = y # 图片距离上边的大小 + 图片自身高度
target.paste(im, (a, b, c, d))
target.paste(way_p, (a1, b1, c1, d1))
way1 = way[:-5] + '5' + way[-5:]
target.save(way1)
print("拼接图片已保存:{}".format(way1))
return(way1)
def qiege(way):
x, y = im.size
left = 0 #图片距离左边的宽度乘积值
shang = 0 #图片距离上边的宽度乘积值
index = 6 #图片名
q = input("请选择: [0]四等分 [1]九等分\n")
if q == '0':
x,y = x/2,y/2
for i in range(4):
if i == 2: # 当循环到第三个值时,需要切第二行的图片
shang += 1
left = 0
a = x * left # 图片距离左边的大小
b = y * shang # 图片距离上边的大小
c = x * (left + 1) # 图片距离左边的大小 + 图片自身宽度
d = y * (shang + 1) # 图片距离上边的大小 + 图片自身高度
croping = im.crop((a,b,c,d))
croping.save(way[:-5] + str(index) + way[-5:])
index += 1
left += 1
print("四宫格图片已保存!")
elif q == '1':
x,y = x/3,y/3
for i in range(9):
if i in [3,6]: # 当循环到第四和七个值时,需要切第二三行的图片
shang += 1
left = 0
a = x * left # 图片距离左边的大小
b = y * shang # 图片距离上边的大小
c = x * (left + 1) # 图片距离左边的大小 + 图片自身宽度
d = y * (shang + 1) # 图片距离上边的大小 + 图片自身高度
croping = im.crop((a,b,c,d))
croping.save(way[:-5] + str(index) + way[-5:])
index += 1
left += 1
print("九宫格图片已保存!")
else:
print("输入错误!")
qiege(way)
way = input("请输入图片路径:")
im = Image.open(way)
print(im.format, im.size, im.mode)
def main():
q = input("请选择要做的操作:\n【0】压缩图片 【1】旋转图片 【2】横向拼接图片 【3】分割图片\n")
if q == '0':
yasuo(way)
elif q == '1':
xuanzhuan(way)
elif q == '2':
pinjie(way)
elif q == '3':
qiege(way)
else:
print("输入错误!请重新输入")
main()
main()
关于图像路径,可以按着shift键不放,然后在图片上右键,【复制为路径】粘贴的时候注意要把两侧的引号去掉,不然会报错
新生成的文件和原文件在同一文件夹下
加了UI界面,可以自己打包成exe文件,在任意电脑上使用
在命令行使用PIP安装库:
pip install tkinter
按下win+R,弹出界面输入cmd回车,然后输入上面命令等待安装完成即可
#图片处理.py
from PIL import Image
import tkinter as tk
import tkinter.messagebox
from tkinter import filedialog,ttk
#打开文件对话框
def getfile():
file_path=filedialog.askopenfilename()
fpath.set(file_path)
way = fpath.get()
im = Image.open(way)
l = tk.Label(win, text=(im.format,im.size,im.mode)).place(x=225, y=55, anchor='nw')
def getfile1():
file_path=filedialog.askopenfilename()
fpath1.set(file_path)
way = fpath1.get()
im = Image.open(way)
def yasuo():
try:
way = fpath.get()
im = Image.open(way)
x, y = im.size
a = eval(beishu.get())
if 0 < a <= 1:
b = 1/a
im.thumbnail((x//b, y//b))
way1 = way[:-5] + '1' + way[-5:]
im.save(way1)
prin = ("缩小后的尺寸:{}".format(im.size))+("图片已保存:{}".format(way1))
tk.messagebox.showinfo(title='压缩成功', message=prin)
except:
tk.messagebox.showerror(title='错误!', message='请输入0-1之间的数字!')
def xuanzhuan():
way = fpath.get()
im = Image.open(way)
q = var.get()
if q == '0':
try:
q1 = abs(eval(dushu.get()))
im1 = im.rotate(q1)
way2 = way[:-5] + '2' + way[-5:]
im1.save(way2)
prin = "旋转{}度图片已保存:{}".format(q1,way2)
tk.messagebox.showinfo(title='旋转成功', message=prin)
except:
tk.messagebox.showinfo(title='输入错误', message='错误!请输入整数!')
elif q == '1':
im1 = im.transpose(Image.FLIP_LEFT_RIGHT)
way2 = way[:-5] + '3' + way[-5:]
im1.save(way2)
prin = "左右翻转图片已保存:{}".format(way2)
tk.messagebox.showinfo(title='旋转成功', message=prin)
elif q == '2':
im1 = im.transpose(Image.FLIP_TOP_BOTTOM)
way2 = way[:-5] + '4' + way[-5:]
im1.save(way2)
prin = "上下翻转图片已保存:{}".format(way2)
tk.messagebox.showinfo(title='旋转成功', message=prin)
else:
tk.messagebox.showerror(title='错误!', message='输入错误!')
def pinjie():
try:
way = fpath.get()
im = Image.open(way)
way_p =Image.open(fpath1.get())
x, y = im.size
q = var2.get()
if q == '0':
target = Image.new('RGB', (x * 2, y * 1))
a = 0
a1 = x # 图片距离左边的大小
b = b1 = 0 # 图片距离上边的大小
c = x
c1 = x*2 # 图片距离左边的大小 + 图片自身宽度
d = d1 = y # 图片距离上边的大小 + 图片自身高度
target.paste(im, (a, b, c, d))
target.paste(way_p, (a1, b1, c1, d1))
way1 = way[:-5] + '5' + way[-5:]
target.save(way1)
tk.messagebox.showinfo(title='保存成功', message='拼接图片已保存成功!')
elif q == '1':
target = Image.new('RGB', (x * 1, y * 2))
a = a1 = 0 # 图片距离左边的大小
b = 0 # 图片距离上边的大小
b1 = y
c = c1 = x # 图片距离左边的大小 + 图片自身宽度
d = y
d1 = y*2 # 图片距离上边的大小 + 图片自身高度
target.paste(im, (a, b, c, d))
target.paste(way_p, (a1, b1, c1, d1))
way1 = way[:-5] + '6' + way[-5:]
target.save(way1)
tk.messagebox.showinfo(title='保存成功', message='拼接图片已保存成功!')
except:
tk.messagebox.showerror(title='错误!', message='错误!请选择两张大小相同的照片!')
def qiege():
way = fpath.get()
im = Image.open(way)
x, y = im.size
left = 0 #图片距离左边的宽度乘积值
shang = 0 #图片距离上边的宽度乘积值
index = 7 #图片名
q = var1.get()
if q == '0':
x,y = x/2,y/2
for i in range(4):
if i == 2: # 当循环到第三个值时,需要切第二行的图片
shang += 1
left = 0
a = x * left # 图片距离左边的大小
b = y * shang # 图片距离上边的大小
c = x * (left + 1) # 图片距离左边的大小 + 图片自身宽度
d = y * (shang + 1) # 图片距离上边的大小 + 图片自身高度
croping = im.crop((a,b,c,d))
croping.save(way[:-5] + str(index) + way[-5:])
index += 1
left += 1
tk.messagebox.showinfo(title='成功', message="四宫格图片已保存!")
elif q == '1':
x,y = x/3,y/3
for i in range(9):
if i in [3,6]: # 当循环到第四和七个值时,需要切第二三行的图片
shang += 1
left = 0
a = x * left # 图片距离左边的大小
b = y * shang # 图片距离上边的大小
c = x * (left + 1) # 图片距离左边的大小 + 图片自身宽度
d = y * (shang + 1) # 图片距离上边的大小 + 图片自身高度
croping = im.crop((a,b,c,d))
croping.save(way[:-5] + str(index) + way[-5:])
index += 1
left += 1
tk.messagebox.showinfo(title='成功', message="九宫格图片已保存!")
else:
tk.messagebox.showerror(title='错误!', message='输入错误!')
win = tk.Tk()
win.title("图片处理")
win.geometry("500x280")
fpath = tk.StringVar()
fpath1 = tk.StringVar()
var1 = tk.StringVar()
var = tk.StringVar()
var2 = tk.StringVar()
beishu = tk.StringVar()
dushu = tk.StringVar()
l = tk.Label(win, text='图片快速处理', bg='brown', font='楷体,30,bold',fg='white')
l.place(x=220, y=0, anchor='nw')
ttk.Button(win,text='点击打开图片',command=getfile).place(x=130, y=25, anchor='nw')
ttk.Entry(win,textvariable=fpath).place(x=230, y=27, anchor='nw')
l = tk.Label(win, text=("图片信息:")).place(x=160, y=55, anchor='nw')
ttk.Button(win,text='压缩图片',command=yasuo).place(x=10, y=90, anchor='nw')
l = tk.Label(win, text=("请输入要压缩的倍数(0-1):")).place(x=100, y=90, anchor='nw')
ttk.Entry(win,textvariable=beishu,width='5').place(x=260, y=90, anchor='nw')
ttk.Button(win,text='旋转图片',command=xuanzhuan).place(x=10, y=130, anchor='nw')
var.set('0')
r1 = tk.Radiobutton(win, text='逆时针旋转度数:', variable=var, value='0')
r1.place(x=100, y=130, anchor='nw')
ttk.Entry(win,textvariable=dushu,width='4').place(x=220, y=130, anchor='nw')
r2 = tk.Radiobutton(win, text='左右翻转', variable=var, value='1')
r2.place(x=260, y=130, anchor='nw')
r3 = tk.Radiobutton(win, text='上下翻转', variable=var, value='2')
r3.place(x=335, y=130, anchor='nw')
ttk.Button(win,text='拼接图片',command=pinjie).place(x=10, y=170, anchor='nw')
l = tk.Label(win, text=("打开要拼接的图片:")).place(x=100, y=170, anchor='nw')
ttk.Button(win,text='...',command=getfile1,width='3').place(x=210, y=167, anchor='nw')
ttk.Entry(win,textvariable=fpath1,width='12').place(x=245, y=170, anchor='nw')
var2.set('0')
r2 = tk.Radiobutton(win, text='横向拼接', variable=var2, value='0')
r2.place(x=340, y=170, anchor='nw')
r3 = tk.Radiobutton(win, text='纵向拼接', variable=var2, value='1')
r3.place(x=415, y=170, anchor='nw')
ttk.Button(win,text='分割图片',command=qiege).place(x=10, y=210, anchor='nw')
var1.set('0')
r1 = tk.Radiobutton(win, text='四宫格', variable=var1, value='0')
r1.place(x=100, y=210, anchor='nw')
r2 = tk.Radiobutton(win, text='九宫格', variable=var1, value='1')
r2.place(x=180, y=210, anchor='nw')
win.mainloop()