Python实战:批量水印添加

一、引言

在日常工作和学习中,我们经常需要对图片或文档添加水印,以保护版权或防止他人未经授权使用。如果手动进行这些操作,不仅费时费力,而且容易出错。因此,编写一个批量水印添加器变得尤为重要。本文将介绍如何使用Python编写一个批量水印添加器,该工具可以为图片或文档添加水印。

二、批量水印添加器的原理

批量水印添加器的核心原理是遍历指定目录下的所有文件,根据用户输入的水印内容和位置,使用图像处理库或PDF处理库为文件添加水印,然后将添加水印后的文件保存到指定目录。在这个过程中,我们需要考虑以下几个问题:

  1. 如何遍历指定目录下的所有文件?
  2. 如何根据用户输入的水印内容和位置添加水印?
  3. 如何保存添加水印后的文件?
    接下来,我们将分别介绍这三个问题的解决方案。

三、批量水印添加器的设计

在设计批量水印添加器时,我们需要考虑以下几个方面的内容:

  1. 用户界面:为了方便用户使用,我们可以设计一个简单的图形界面,让用户可以直观地选择目录、输入水印内容和位置等。
  2. 水印添加:我们需要编写一个水印添加器,根据用户输入的水印内容和位置,使用图像处理库或PDF处理库为文件添加水印。
  3. 文件保存:我们需要编写一个文件保存器,用于将添加水印后的文件保存到指定目录。

四、批量水印添加器的实现

接下来,我们将详细介绍批量水印添加器的实现过程。为了方便起见,我们将使用Python编写这个工具。

  1. 用户界面
    我们可以使用Python的Tkinter库来设计一个简单的图形界面。界面包括以下几个部分:
  • 目录选择:让用户选择需要添加水印的文件所在的目录。
  • 水印内容输入:让用户输入需要添加的水印内容。
  • 水印位置选择:让用户选择水印的位置。
  • 执行按钮:用于执行批量水印添加操作。
  1. 水印添加
    对于图片文件,我们可以使用Python的Pillow库来添加水印。具体实现如下:
from PIL import Image, ImageDraw, ImageFont
def add_watermark_image(image_path, watermark_text, position, output_path):
    image = Image.open(image_path)
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("arial.ttf", 36)
    draw.text(position, watermark_text, font=font, fill=(255, 255, 255, 128))
    image.save(output_path)

对于PDF文件,我们可以使用Python的PyPDF2库来添加水印。具体实现如下:

from PyPDF2 import PdfFileWriter, PdfFileReader
def add_watermark_pdf(pdf_path, watermark_text, output_path):
    pdf_reader = PdfFileReader(pdf_path)
    pdf_writer = PdfFileWriter()
    for page_num in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page_num)
        page.mergePage(add_watermark_page(watermark_text))
        pdf_writer.addPage(page)
    with open(output_path, "wb") as out_file:
        pdf_writer.write(out_file)
def add_watermark_page(watermark_text):
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    c = canvas.Canvas("watermark.pdf", pagesize=letter)
    c.setFont("Helvetica", 36)
    c.setFillGray(0.5)
    c.drawString(100, 100, watermark_text)
    c.save()
    watermark_pdf = PdfFileReader("watermark.pdf")
    return watermark_pdf.getPage(0)
  1. 文件保存
    我们可以使用Python的os库来保存添加水印后的文件。具体实现如下:
import os
def save_file(file_path, output_dir):
    file_name = os.path.basename(file_path)
    output_path = os.path.join(output_dir, file_name)
    return output_path

五、完整代码示例

import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageFont
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def add_watermark_image(image_path, watermark_text, position, output_path):
    image = Image.open(image_path)
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("arial.ttf", 36)
    draw.text(position, watermark_text, font=font, fill=(255, 255, 255, 128))
    image.save(output_path)
def add_watermark_pdf(pdf_path, watermark_text, output_path):
    pdf_reader = PdfFileReader(pdf_path)
    pdf_writer = PdfFileWriter()
    for page_num in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page_num)
        page.mergePage(add_watermark_page(watermark_text))
        pdf_writer.addPage(page)
    with open(output_path, "wb") as out_file:
        pdf_writer.write(out_file)
def add_watermark_page(watermark_text):
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    c = canvas.Canvas("watermark.pdf", pagesize=letter)
    c.setFont("Helvetica", 36)
    c.setFillGray(0.5)
    c.drawString(100, 100, watermark_text)
    c.save()
    watermark_pdf = PdfFileReader("watermark.pdf")
    return watermark_pdf.getPage(0)
def save_file(file_path, output_dir):
    file_name = os.path.basename(file_path)
    output_path = os.path.join(output_dir, file_name)
    return output_path
def batch_add_watermark():
    dir_path = dir_entry.get()
    watermark_text = watermark_entry.get()
    output_dir = output_entry.get()
    file_list = [f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))]
    for file_name in file_list:
        file_path = os.path.join(dir_path, file_name)
        output_path = save_file(file_path, output_dir)
        if file_name.lower().endswith(('.png', '.jpg', '.jpeg')):
            add_watermark_image(file_path, watermark_text, (10, 10), output_path)
        elif file_name.lower().endswith('.pdf'):
            add_watermark_pdf(file_path, watermark_text, output_path)
    print("Watermark added to all files.")
app = tk.Tk()
app.title("批量水印添加器")
dir_label = tk.Label(app, text="选择目录:")
dir_label.grid(row=0, column=0, sticky="e")
dir_entry = tk.Entry(app, width=50)
dir_entry.grid(row=0, column=1, padx=5, pady=5)
dir_button = tk.Button(app, text="浏览", command=lambda: dir_entry.insert(0, filedialog.askdirectory()))
dir_button.grid(row=0, column=2)
watermark_label = tk.Label(app, text="水印内容:")
watermark_label.grid(row=1, column=0, sticky="e")
watermark_entry = tk.Entry(app, width=50)
watermark_entry.grid(row=1, column=1, padx=5, pady=5)
output_label = tk.Label(app, text="输出目录:")
output_label.grid(row=2, column=0, sticky="e")
output_entry = tk.Entry(app, width=50)
output_entry.grid(row=2, column=1, padx=5, pady=5)
output_button = tk.Button(app, text="浏览", command=lambda: output_entry.insert(0, filedialog.askdirectory()))
output_button.grid(row=2, column=2)
add_button = tk.Button(app, text="添加水印", command=batch_add_watermark)
add_button.grid(row=3, column=1, pady=10)
app.mainloop()
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值