Python--快捷生成朋友圈九宫格图片

这个博客介绍了一个Python脚本,该脚本使用PIL库进行图片处理,包括压缩、旋转、拼接和分割图片。此外,它还添加了一个简单的Tkinter图形用户界面,使得用户可以更直观地进行这些操作。用户可以选择图片并指定参数,程序将保存处理后的图片,并显示操作结果。通过安装pip install pillow和pip install tkinter,可以在命令行中运行此程序。
摘要由CSDN通过智能技术生成

在命令行使用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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值