目录
前言
本文介绍一个用python第三方库pillow写的批量处理图片加水印的脚本,以及脚本对应的使用tkinter库写的GUI界面并把它打包成exe可执行文件,打包成可执行文件的好处就是它支持多种操作系统,如 Windows、Linux 和 Mac OS 等。不了解pillow库和tkinter库的可以看我之前的文章,具体在下面的导航区域。
导航
pillow库的使用篇
- 图像处理库Pillow(PIL)的使用-1(实例+详细注释+图片脚本)
- 图像处理库Pillow(PIL)的使用-2(实例+详细注释+图片脚本)
- 图像处理库Pillow(PIL)的使用-3(实例+详细注释+图片脚本)
tkiner库的使用篇
图片脚本篇
- python图片脚本1-批量处理图片尺寸(详细注释+GUI界面+exe可执行文件)
- python图片脚本2-图片文件批量命名(详细注释+GUI界面+exe可执行文件)
- python图片脚本3-批量图片格式转换-(详细注释+GUI界面+exe可执行文件)
- python图片脚本4-批量图片加水印(详细注释+GUI界面+exe可执行文件)
源码
批量处理图片尺寸脚本源码
from PIL import Image, ImageDraw, ImageFont # 图像处理库
# 打开图片
image = Image.open("images/1.jpg").convert("RGBA")
# 获取图片的宽高
width, height = image.size
# 创建一个与原图大小相同的透明图像,是因为后面文字不能直接加调透明度,需要加一个新的图片作为背景调透明度
text_image = Image.new("RGBA", (width, height), (0, 0,0,0))
# 创建画笔
draw = ImageDraw.Draw(text_image)
# 设置字体
font = ImageFont.truetype("arial.ttf", 80)
# 在透明图像上绘制文字, 文字内容,字体,颜色,位置
draw.text((100, 100), "laity", font=font, fill=(255, 0, 0,128))
# 将透明图像粘贴到原图上
image.paste(text_image, (0, 0), text_image)
# 显示图片
image.show()
效果
GUI界面源码
import tkinter as tk # GUI库
from tkinter import filedialog, messagebox # 文件选择框,消息框
from PIL import Image, ImageDraw, ImageFont # 图像处理库
# 水印位置函数
def draw_text_at_position(draw, text, font, fill_color, position, width, height):
if position == 'top_left':
draw.text((0, 0), text, font=font, fill=fill_color)
elif position == 'top_right':
draw.text((width ,0), text, font=font, fill=fill_color)
elif position == 'bottom_left':
draw.text((0, height ), text, font=font, fill=fill_color)
elif position == 'bottom_right':
draw.text((width ,height ), text, font=font, fill=fill_color)
elif position == 'center':
draw.text((width // 2, height // 2), text, font=font, fill=fill_color)
# 应用水印函数
def apply_watermark():
# 获取原图路径
input_path = input_entry.get()
if not input_path:
messagebox.showerror("错误", "请输入原图路径")
return
# 获取输出路径
output_path = output_entry.get()
if not output_path:
messagebox.showerror("错误", "请输入输出路径")
return
# 获取水印文字
text = text_entry.get()
if not text:
messagebox.showerror("错误", "请输入水印文字")
return
# 获取水印颜色和透明度
fill_color = (255, 0, 0, int(opacity_scale.get() * 255))
try:
# 打开原图
image = Image.open(input_path).convert("RGBA")
width, height = image.size
# 创建一个与原图大小相同的透明图像
text_image = Image.new("RGBA", (width, height), (0, 0, 0, 0))
draw = ImageDraw.Draw(text_image)
# 设置字体
font = ImageFont.truetype("arial.ttf", 80)
# 设置文字位置
position = position_var.get()
# 调用函数绘制文字
draw_text_at_position(draw, text, font, fill_color, position, width, height)
# 将透明图像粘贴到原图上
image.paste(text_image, (0, 0), text_image)
# 保存图片
image.save(output_path, "PNG")
messagebox.showinfo("成功", "水印添加成功")
except Exception as e:
messagebox.showerror("错误", str(e))
# 获取文件路径函数
def browse_input():
# 弹出文件选择框,选择图片文件
input_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.jpeg *.png")])
# 清空输入框并插入新的路径
input_entry.delete(0, tk.END)
input_entry.insert(0, input_path)
def browse_output():
output_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
output_entry.delete(0, tk.END)
output_entry.insert(0, output_path)
# 创建主窗口
root = tk.Tk()
root.title("批量加水印工具")
# 创建和放置组件
tk.Label(root, text="原图路径:").grid(row=0, column=0, padx=10, pady=10)
input_entry = tk.Entry(root, width=50)
input_entry.grid(row=0, column=1, padx=10, pady=10)
browse_input_button = tk.Button(root, text="浏览", command=browse_input)
browse_input_button.grid(row=0, column=2, padx=10, pady=10)
# 输出路径
tk.Label(root, text="输出路径:").grid(row=1, column=0, padx=10, pady=10)
output_entry = tk.Entry(root, width=50)
output_entry.grid(row=1, column=1, padx=10, pady=10)
browse_output_button = tk.Button(root, text="浏览", command=browse_output)
browse_output_button.grid(row=1, column=2, padx=10, pady=10)
# 水印文字
tk.Label(root, text="水印文字:").grid(row=2, column=0, padx=10, pady=10)
text_entry = tk.Entry(root, width=50)
text_entry.grid(row=2, column=1, padx=10, pady=10)
# 透明度
tk.Label(root, text="透明度:").grid(row=3, column=0, padx=10, pady=10)
opacity_scale = tk.Scale(root, from_=0.0, to=1.0, resolution=0.01, orient=tk.HORIZONTAL, length=200)
opacity_scale.set(0.5)
opacity_scale.grid(row=3, column=1, padx=10, pady=10)
# 文字位置
tk.Label(root, text="文字位置:").grid(row=4, column=0, padx=10, pady=10)
position_var = tk.StringVar(value='center')
positions = ['top_left', 'top_right', 'bottom_left', 'bottom_right', 'center']
position_menu = tk.OptionMenu(root, position_var, *positions)
position_menu.grid(row=4, column=1, padx=10, pady=10)
# 应用按钮
apply_button = tk.Button(root, text="应用水印", command=apply_watermark)
apply_button.grid(row=5, column=1, padx=10, pady=10)
# 运行主循环
root.mainloop()
效果
打包成.exe可执行文件
需要安装python第三方库pyinstaller
pip install pyinstaller
在文件所在目录的终端输入下面的命令,就可以把把刚刚的GUI界面打包成一个.exe可执行文件。
pyinsataller filename
filename是要打包的源文件的名称
比如我要打包我写的图片批量命名的脚本打包成.exe可执行文件,可以在终端使用下面的命令:
pyinstaller mask1.py
共勉
努力工作是为了更好的生活!
博客
- 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感兴趣的同学可以关注一下,大家一起进步。
- 之前在公众号发布了一个kali破解WiFi的文章,感兴趣的同学可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频。