Добавление водяного знака в Python

Добавление водяного знака в Python

Добавление водяных знаков на изображения – важный этап защиты визуального контента от несанкционированного использования. Python предлагает мощные библиотеки, такие как Pillow (PIL), для работы с изображениями. В этой статье мы подробно разберем скрипт для добавления водяного знака на изображения, чтобы вы могли защитить свои работы эффективно и просто.

Подготовка к работе: что делает этот код

Этот Python-скрипт автоматически добавляет водяной знак на все изображения в указанной папке и сохраняет их в отдельной директории. Основные задачи:

  • Обработка изображений с использованием библиотеки Pillow.
  • Ресайзинг (изменение размера) водяного знака пропорционально основному изображению.
  • Расположение водяного знака в правом нижнем углу.
  • Сохранение результата в формате, оптимальном для дальнейшего использования.

Установка библиотеки Pillow

Перед запуском скрипта необходимо установить Pillow:

pip install pillow

Основная структура кода

Код включает функции:

  • watermark_photo() — добавляет водяной знак к изображению.
  • Работа с файлами: обработка всех изображений из указанной папки.

Разбор функции watermark_photo

def watermark_photo(input_image_path, watermark_image_path, output_image_path):

Аргументы функции

  1. input_image_path — путь к исходному изображению.
  2. watermark_image_path — путь к водяному знаку.
  3. output_image_path — путь для сохранения обработанного изображения.

Открытие изображений

base_image = Image.open(input_image_path)
watermark = Image.open(watermark_image_path).convert("RGBA")
  • Загружаем основное изображение и водяной знак.
  • Конвертируем водяной знак в формат RGBA, чтобы обработать прозрачные области.

Ресайзинг водяного знака

position = base_image.size
newsize = (int(position[0] * 8 / 100), int(position[0] * 8 / 100))
watermark = watermark.resize(newsize)
  • Рассчитываем размер водяного знака как 8% от ширины основного изображения.
  • Меняем размер водяного знака для пропорционального отображения.

Расположение водяного знака

new_position = position[0] - newsize[0] - 20, position[1] - newsize[1] - 20
  • Вычисляем координаты, чтобы разместить водяной знак в правом нижнем углу с отступом 20 пикселей.

Слияние изображений

transparent = Image.new(mode='RGBA', size=position, color=(0, 0, 0, 0))
transparent.paste(base_image, (0, 0))
transparent.paste(watermark, new_position, watermark)
  • Создаем прозрачное изображение с теми же размерами, что и основное.
  • Копируем основное изображение и накладываем водяной знак.

Конвертация и сохранение результата

image_mode = base_image.mode
if image_mode == 'RGB':
    transparent = transparent.convert(image_mode)
else:
    transparent = transparent.convert('P')
transparent.save(output_image_path, optimize=True, quality=100)
  • Конвертируем изображение в исходный режим (RGB или P).
  • Сохраняем результат с максимальным качеством.

Обработка всех файлов в папке

folder = input("Enter Folder Path:")
watermark = input("Enter Watermark Path:")
os.chdir(folder)
files = os.listdir(os.getcwd())
  • Пользователь указывает папку с изображениями и путь к водяному знаку.
  • Все изображения из папки обрабатываются циклом.

Создание директории для сохранения

if not os.path.isdir("output"):
    os.mkdir("output")

Проверяем, есть ли папка output. Если нет, создаем её для сохранения обработанных файлов.

Обработка изображений в цикле

for f in files:
    if os.path.isfile(os.path.abspath(f)):
        if f.endswith(".png") or f.endswith(".jpg"):
            watermark_photo(f, watermark, "output/" + f)
  • Обрабатываем только файлы с расширениями .png и .jpg.
  • Для каждого файла вызывается функция watermark_photo.

Пример использования

  • Создайте папку с изображениями и водяным знаком.
  • Запустите скрипт и укажите пути к папке и файлу водяного знака.
  • Проверьте папку output для сохраненных изображений с водяным знаком.

Заключение

Этот скрипт универсален и легко адаптируется под ваши потребности. Вы можете изменять размер водяного знака, его расположение или параметры сохранения. Благодаря библиотеке Pillow процесс автоматизации становится простым даже для начинающих программистов.

Полный код:

import os
from PIL import Image


def watermark_photo(input_image_path, watermark_image_path, output_image_path):
    base_image = Image.open(input_image_path)
    watermark = Image.open(watermark_image_path).convert("RGBA")
    position = base_image.size
    newsize = (int(position[0]*8/100), int(position[0]*8/100))
    watermark = watermark.resize(newsize)
    new_position = position[0]-newsize[0]-20, position[1]-newsize[1]-20
    transparent = Image.new(mode='RGBA', size=position, color=(0, 0, 0, 0))
    transparent.paste(base_image, (0, 0))
    transparent.paste(watermark, new_position, watermark)
    image_mode = base_image.mode
    print(image_mode)
    if image_mode == 'RGB':
        transparent = transparent.convert(image_mode)
    else:
        transparent = transparent.convert('P')
    transparent.save(output_image_path, optimize=True, quality=100)
    print("Saving"+output_image_path+"...")


folder = input("Enter Folder Path:")
watermark = input("Enter Watermark Path:")
os.chdir(folder)
files = os.listdir(os.getcwd())
print(files)

if not os.path.isdir("output"):
    os.mkdir("output")

c = 1
for f in files:
    if os.path.isfile(os.path.abspath(f)):
        if f.endswith(".png") or f.endswith(".jpg"):
            watermark_photo(f, watermark, "output/"+f)
Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.