为图片添加水印(Python)

server/2024/10/20 15:43:58/

简介

刚好学了一下tkinter.colorchooser,然后……

优化了以前的代码,不过仍然是shi

功能

可自由添加水印内容、选择颜色、字体及字体大小、图片、水印的x、y位置

代码

python"># -*- coding: utf-8 -*-
# Environment    PyCharm
# File_name   visibleWaterMark |User    Pfolg
# 2024/8/7   19:30
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from tkinter import ttk, filedialog, messagebox, colorchooser
import tkinter as tk
import osdef watermark_Image(img_path, text, pos, color="#FFFFFF", textFont="STSONG.TTF", textSize=20):image = Image.open(img_path)drawing = ImageDraw.Draw(image)# 加载字体文件font = ImageFont.truetype(font=textFont, size=textSize)drawing.text(pos, text, fill=color, font=font)image.show()# img.save(output_path)# img = ".\\旅行.png"
# watermark_Image(img, ".\\output.png", 'Python', pos=(10, 10))
def visibleWaterMarkFindFile(x, text):win = tk.Tk()win.withdraw()file_path = filedialog.askopenfilename()x.set(file_path)try:image = Image.open(file_path)width, height = image.sizetext.set(f"图片长[{width}],宽[{height}]")except BaseException:text.set("")win.destroy()def choose_color(x):color = colorchooser.askcolor(title="颜色选择")if color[1]:x["background"] = color[1]def choose_font(x):ft = filedialog.askopenfilename(initialdir=r"C:\Windows\Fonts")if ft:x.set(ft)def visibleWaterMark(frame):markContent, phoPath, positionX, positionY, markFont, fontSize = tk.StringVar(), tk.StringVar(), tk.IntVar(), tk.IntVar(), tk.StringVar(), tk.IntVar()nameList = ['内容', '颜色', '图片路径', '左上角x', '左上角y', '字体', '字体大小']varList = [markContent, 1, phoPath, positionX, positionY, markFont, fontSize]markFont.set("STSONG.TTF")fontSize.set(20)positionX.set(10)positionY.set(10)imageSize = tk.StringVar()ttk.Label(frame, textvariable=imageSize).place(relx=.7, rely=.42)ch_color = tk.Button(frame, width=3, relief="groove", command=lambda: choose_color(ch_color), background="#000000", text="")for i in range(len(nameList)):ttk.Label(frame, text=nameList[i]).place(relx=.3, rely=.12 + i * .1)if i == 1:ch_color.place(relx=.4, rely=.12 + i * .1)continueif i == 5:ttk.Combobox(frame, textvariable=markFont, values=list(os.walk(r"C:\Windows\Fonts"))[0][2], width=17).place(relx=.4, rely=.12 + i * .1)continuetk.Entry(frame, textvariable=varList[i], width=20).place(relx=.4, rely=.12 + i * .1)if i == 2:ttk.Button(frame, text="浏览", width=8, command=lambda: visibleWaterMarkFindFile(varList[2], imageSize)).place(relx=.6, rely=.12 + i * .1)ttk.Button(frame, text="添加水印", width=8, command=lambda: watermark_Image(phoPath.get(), markContent.get(), pos=(positionX.get(), positionY.get()),color=ch_color["background"], textFont=markFont.get(), textSize=fontSize.get())).place(relx=.43, rely=.85)instruction = ("不支持图片保存;\n作者为了打游戏,并且希望用户可以有最大的自由去制作水印,位置x,y可以靠感觉做,默认左上角;\n""字体设置方法:打开[C:\Windows\Fonts],右键选择喜欢的字体,右键[属性],复制[*.ttf],粘贴至[字体]就完成设定了;\n""三个需要填入数字的输入框均只支持整数;\n")ttk.Button(frame, text="Help", width=8, command=lambda: messagebox.showinfo(title="提示信息", message=instruction)).place(relx=.9, rely=.8)ttk.Button(frame, text="Close", width=8, command=lambda: window.destroy()).place(relx=.9, rely=.9)if __name__ == '__main__':window = tk.Tk()window.title("VisibleWaterMark")screen_w, screen_h = window.winfo_screenwidth(), window.winfo_screenheight()w, h = int(screen_w / 2), int(screen_h / 2)window.geometry(f'{w}x{h}+{int(screen_w / 4)}+{int(screen_h / 4)}')window.resizable(False, False)# window.iconbitmap(".\\resource\\pg.ico")window.attributes('-alpha', 0.9)f = ttk.Frame(window)visibleWaterMark(f)f.place(relx=0, rely=0, width=w, height=h)window.mainloop()

分析

核心代码

python">def watermark_Image(img_path, text, pos, color="#FFFFFF", textFont="STSONG.TTF", textSize=20):image = Image.open(img_path)drawing = ImageDraw.Draw(image)# 加载字体文件font = ImageFont.truetype(font=textFont, size=textSize)drawing.text(pos, text, fill=color, font=font)image.show()# img.save(output_path)

浏览字体文件夹并提取字体

python">ttk.Combobox(frame, textvariable=markFont, values=list(os.walk(r"C:\Windows\Fonts"))[0][2], width=17  # 浏览字体文件夹并提取字体).place(relx=.4, rely=.12 + i * .1)

 选择颜色

python">def choose_color(x):color = colorchooser.askcolor(title="颜色选择")if color[1]:x["background"] = color[1]

 选择图片并给出图片的参数

python">def visibleWaterMarkFindFile(x, text):win = tk.Tk()win.withdraw()file_path = filedialog.askopenfilename()x.set(file_path)try:image = Image.open(file_path)width, height = image.sizetext.set(f"图片长[{width}],宽[{height}]")except BaseException:text.set("")win.destroy()

实现效果

UI

 结果

完成后会弹出图片,不会自动保存,需要用户自己手动保存,免得程序保存图片到一个用户找不到的位置


http://www.ppmy.cn/server/133381.html

相关文章

python 作业1

任务1: python为主的工作是很少的 学习的python的优势在于制作工具,制作合适的工具可以提高我们在工作中的工作效率的工具 提高我们的竞争优势。 任务2: 不换行 换行 任务3: 安装pycharm 进入相应网站Download PyCharm: The Python IDE for data science and we…

输入输出--I/O流【C++提升】

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…

Vulhub Wakanda : 1靶机详解

1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:DB:19:701.2. 端口扫描 nmap 192.168.7.171 -p- -A1.3. 目录扫描 dirb http://192.168.7.1711.4. 敏感信息收集 whatweb http://192.168.7.1712. WEB打点寻找漏洞点 …

IC验证面试中常问知识点总结(八)附带详细回答!!!

16、 callback机制 16.1 callback机制有什么用? 程序的设计者有时不是程序的使用者,所以作为程序的使用者来说,总是希望程序的设计者能够提供一些接口来满足自己的应用需求。作为这两者之间的一个协调,callback机制出现了。 第一,callback机制可以提高验证平台的可重用性…

基于STM32单片机设计的矿山环境作业安全监测系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】需求总结1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 模块的技术详情介绍【1】BC26-NBIOT模块【2】DHT11温湿度模块【3】PM2.5粉尘模块二…

【JavaScript】LeetCode:76-80

文章目录 76 有效的括号77 最小栈78 字符串解码79 每日温度80 柱形图中最大的矩形 76 有效的括号 栈三种不匹配的情况&#xff1a; ( [ { } ] ( )&#xff0c;最左边的"("多余&#xff0c;即字符串遍历完了&#xff0c;栈还不为空。[ { ( } } ]&#xff0c;中间"…

从零开始的LeetCode刷题日记:104. 二叉树的最大深度

一.相关链接 题目链接&#xff1a;104. 二叉树的最大深度 二.心得体会 这道题思路很简单&#xff0c;在遇到叶子节点的时候返回0&#xff0c;然后分别求左右子树的深度&#xff0c;最后加上本身节点的一个深度。因为是从树的深度&#xff0c;所以从下往上统计&#xff0c;即…

SVN小乌龟 create patch 和 apply patch 功能

在SVN&#xff08;Subversion&#xff09;版本控制系统中&#xff0c;使用“小乌龟”&#xff08;TortoiseSVN&#xff09;这个图形界面工具可以极大地简化SVN操作。TortoiseSVN中的“create patch”和“apply patch”是两个非常有用的功能&#xff0c;它们与版本控制中的补丁&…