首页 > 编程语言 >python图片脚本4-批量图片加水印(详细注释+GUI界面+exe可执行文件)

python图片脚本4-批量图片加水印(详细注释+GUI界面+exe可执行文件)

时间:2024-12-25 22:55:07浏览次数:5  
标签:10 exe python text image tk font root 图片

目录

前言

本文介绍一个用python第三方库pillow写的批量处理图片加水印的脚本,以及脚本对应的使用tkinter库写的GUI界面并把它打包成exe可执行文件,打包成可执行文件的好处就是它支持多种操作系统,如 Windows、Linux 和 Mac OS 等。不了解pillow库和tkinter库的可以看我之前的文章,具体在下面的导航区域。

导航

pillow库的使用篇

tkiner库的使用篇

图片脚本篇

源码

批量处理图片尺寸脚本源码

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)也发布了相应的教学视频

标签:10,exe,python,text,image,tk,font,root,图片
From: https://blog.csdn.net/qq_67581528/article/details/144712143

相关文章

  • Python 抽象基类 ABC :从实践到优雅
    今天我们来聊聊Python中的抽象基类(AbstractBaseClass,简称ABC)。虽然这个概念在Python中已经存在很久了,但在日常开发中,很多人可能用得并不多,或者用得不够优雅。让我们从一个实际场景开始:假设你正在开发一个文件处理系统,需要支持不同格式的文件读写,比如JSON、CSV、XML等。......
  • Python数据分析_Pandas_数据分析入门_3
    文章目录今日内容大纲介绍1.DataFrame-保存数据到文件2.DataFrame-读取文件数据3.DataFrame-数据分析入门4.DataFrame-分组聚合计算5.Pandas-基本绘图6.Pandas-常用排序方法7.Pandas案例-链家数据分析7.Pandas案例-链家数据分析_GIF_demo了解数据df1.info()df1.describ......
  • python爬虫实验:用Python爬取链家指定数据--附完整代码(基于requests和BeautifulSoup实
    1、前言 本实验实现了对链家房屋名字,所在小区,装饰,是否核验,楼层,总楼层以及租金进行爬取,仅供学习使用。2、url分析第二页:https://cd.lianjia.com/ershoufang/pg2/第三页:https://cd.lianjia.com/ershoufang/pg3/故第i页的url为:https://cd.lianjia.com/ershoufang/pg{i}/......
  • html,css实现图片轮播
    html:Title<!--末尾补一个首尾数据--><li><imgsrc="4cdca0ed47bdc97f0638dc1366d5652.jpg"></li></ul>css:*{padding:0;margin:0;}li{list-style:none;}body,html{width:......
  • WebP图片格式
    WebPWebP是一种图片文件格式,由Google开发,用于提供更好的图像压缩性能。支持有损压缩和无损压缩,同时支持透明度(类似PNG格式的alpha通道)和动画(类似GIF格式)。WebP特点高效压缩•有损压缩:与JPEG相比,WebP的文件体积更小,同时保持类似的图像质量。•无损压缩:相比PNG,W......
  • Python的安装以及环境变量的配置
    一、python是什么及如何安装?Python是一种面向对象、解释型、动态类型计算机程序设计语言,是一种面向对象的动态类型语言;其能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。二、安装步骤下载地址:https://www.python.org/downloads/windows/下载完成后......
  • Python变量与数据类型
    一、什么是Python变量1,变量就是数据的别名2,使用变量等同于使用数据3,随着程序的进行,变量发生变化#将数据10赋予变量(别名)a,可以使用a代替10a=10b=20c=30#通过print函数可以将多个内容输出到控制台print(a)print(b)print(c)print(a+b)print(a+c)print(b......
  • python多进程,通过内存共享来通信,使用进程锁来防止数据问题
    代码:importmultiprocessingimporttime'''使用锁和multiprocessing.Value,multiprocessing.Array,multiprocessing.Manager().list'''defworker1(shared_number1,lock):for_inrange(10):withlock:......
  • python多进程之间通讯,消息队列Queue
    代码:frommultiprocessingimportProcess,Queuedefproducer(q):myinfo="包子"q.put(myinfo)print(f"生产了{myinfo}")myinfo="饺子"q.put(myinfo)print(f"生产了{myinfo}\n")''......
  • Python 中的文件处理
    Python中的文件处理Python中的文件处理文件操作打开和关闭文件读写文件使用上下文管理器(ContextManager)在多个文件上操作Python中的文件处理从文件读取数据或向文件写入数据是任何编程语言支持的基本操作之一。Python为处理文件操作提供了广泛的支持,这些操作大......