Добавление водяных знаков на изображения – важный этап защиты визуального контента от несанкционированного использования. 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):
Аргументы функции
input_image_path
— путь к исходному изображению.watermark_image_path
— путь к водяному знаку.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)
Пока нет комментариев. Будьте первым!