FA-TOOLS — Header Component
کدهای آماده ساخت واترمارک روی تصویر با پایتون

کدهای آماده ساخت واترمارک روی تصویر با پایتون

خلاصه مقاله:

  • یادگیری نحوه درج متن‌های نیمه‌شفاف و لوگو روی تصاویر با کتابخانه قدرتمند Pillow در پایتون.
  • دسترسی به کدهای تست‌شده و آماده برای پروژه‌های شخصی و تجاری بدون نیاز به ابزارهای جانبی سنگین.
  • امکان اتوماتیک‌سازی فرآیند واترمارک برای صدها تصویر به صورت همزمان تنها در چند ثانیه.

۱. واترمارک چیست و چگونه در پایتون پیاده‌سازی می‌شود؟

کدهای آماده ساخت واترمارک روی تصویر با پایتون — تصویر 1

ساخت واترمارک روی تصویر با پایتون یک فرآیند برنامه‌نویسی است که در آن یک لایه متنی یا تصویری نیمه‌شفاف برای حفظ کپی‌رایت روی تصویر اصلی ادغام می‌شود. با استفاده از پایتون و کتابخانه‌های پردازش تصویر آن، می‌توانید این کار را به صورت کاملاً خودکار، سریع و در مقیاس بزرگ برای هزاران فایل انجام دهید.

حفاظت از آثار دیجیتال در دنیای امروز اهمیت بسیار زیادی دارد. فرقی نمی‌کند عکاس باشید، صاحب یک فروشگاه اینترنتی پر از تصاویر محصولات اختصاصی باشید یا یک تولیدکننده محتوا؛ در هر صورت کپی شدن بدون اجازه تصاویرتان می‌تواند زحمات شما را هدر دهد. برنامه‌نویسی به ما این امکان را می‌دهد که به جای استفاده از ابزارهای ویرایش دستی مانند فتوشاپ، با چند خط کد ساده پایتون، امنیت تصاویر خود را تامین کنیم.

۲. پیش‌نیازها و نصب کتابخانه Pillow

کدهای آماده ساخت واترمارک روی تصویر با پایتون — تصویر 2

کتابخانه اصلی برای کار با تصاویر در پایتون، Pillow نام دارد که در واقع نسخه توسعه‌یافته و به‌روزشده کتابخانه قدیمی PIL (Python Imaging Library) است. این کتابخانه ابزارهای فوق‌العاده‌ای برای باز کردن، تغییر اندازه، چرخاندن و ترکیب تصاویر در اختیار ما قرار می‌دهد.

برای شروع کار با این کتابخانه و استفاده از کدهای این مقاله، ابتدا باید آن را از طریق ترمینال یا خط فرمان سیستم خود نصب کنید. در صورتی که به دنبال سایر ابزارهای کاربردی هستید، می‌توانید بخش تکه‌کدهای پایتون را نیز بررسی کنید. برای نصب کتابخانه Pillow دستور زیر را در ترمینال خود اجرا کنید:

pip install Pillow

۳. کد آماده ساخت واترمارک متنی با فونت دلخواه

کدهای آماده ساخت واترمارک روی تصویر با پایتون — تصویر 3

برای ایجاد واترمارک متنی در پایتون، ابتدا یک تصویر شفاف (Transparent) با همان ابعاد تصویر اصلی می‌سازیم، متن را با فونت و میزان شفافیت دلخواه روی آن می‌نویسیم و در نهایت این دو لایه را با یکدیگر ترکیب می‌کنیم.

کد زیر یک نمونه کاملاً بهینه و استاندارد برای قرار دادن متن روی تصویر است. این کد قابلیت دریافت فونت‌های استاندارد مانند تاهوما، ایران‌سنس یا هر فونت TTF دیگری را دارد و می‌توانید موقعیت و میزان شفافیت متن را به صورت دقیق کنترل کنید.

from PIL import Image, ImageDraw, ImageFont

def add_text_watermark(input_image_path, output_image_path, text, position, font_path=None, font_size=40, opacity=128):
# باز کردن تصویر اصلی و تبدیل آن به مود RGBA برای پشتیبانی از شفافیت
original_image = Image.open(input_image_path).convert(“RGBA”)

# ساخت یک تصویر کاملاً شفاف هم‌اندازه با تصویر اصلی
watermark_layer = Image.new(“RGBA”, original_image.size, (255, 255, 255, 0))

# تنظیم فونت متنی
try:
if font_path:
font = ImageFont.truetype(font_path, font_size)
else:
font = ImageFont.load_default()
except IOError:
font = ImageFont.load_default()
print(“هشدار: فونت پیدا نشد. از فونت پیش‌فرض سیستم استفاده شد.”)

# ایجاد ابزار طراحی روی لایه شفاف
draw = ImageDraw.Draw(watermark_layer)

# نوشتن متن روی تصویر با رنگ سفید و شفافیت تنظیم‌شده (RGBA)
# مقدار opacity عددی بین 0 تا 255 است
text_color = (255, 255, 255, opacity)
draw.text(position, text, fill=text_color, font=font)

# ترکیب تصویر اصلی با لایه واترمارک متنی
combined_image = Image.alpha_composite(original_image, watermark_layer)

# ذخیره‌سازی تصویر نهایی به فرمت دلخواه (مثلاً JPEG بدون شفافیت پس‌زمینه)
combined_image.convert(“RGB”).save(output_image_path, “JPEG”)
print(f”تصویر واترمارک‌شده با موفقیت در مسیر {output_image_path} ذخیره شد.”)

# مثال استفاده از تابع:
# add_text_watermark(“input.jpg”, “output_text.jpg”, “CopyRight – Fa-Tools”, (50, 50), font_size=50, opacity=150)

توضیح پارامترهای کلیدی تابع:

  • original_image.convert(“RGBA”): اگر عکس شما به صورت پیش‌فرض کانال آلفا (شفافیت) نداشته باشد، این متد آن را برای پردازش‌های بعدی آماده می‌کند.
  • Image.alpha_composite: به جای چسباندن ساده، دو تصویر را به صورت ریاضی بر اساس شفافیت ادغام می‌کند که خروجی بسیار تمیزتر و طبیعی‌تری به ما می‌دهد.
  • opacity: کنترل‌کننده شفافیت متن است. عدد 0 کاملاً محو و عدد 255 کاملاً کدر و درخشان خواهد بود.

۴. کد آماده قرار دادن لوگو روی تصویر (واترمارک تصویری)

کدهای آماده ساخت واترمارک روی تصویر با پایتون — تصویر 4

برای قرار دادن لوگو روی تصاویر، پایتون به ما این امکان را می‌دهد که ابتدا لوگوی خود را با حفظ شفافیت پس‌زمینه (فرمت PNG بدون بک‌گراند) باز کنیم، ابعاد آن را بر اساس نسبت تصویر اصلی تغییر دهیم و سپس آن را در مختصات مشخصی از تصویر اصلی بچسبانیم.

کد زیر به شکلی هوشمندانه طراحی شده است؛ به طوری که به طور خودکار اندازه لوگو را متناسب با تصویر شما تنظیم می‌کند تا در تصاویر کوچک یا بسیار بزرگ، لوگو بیش از حد بزرگ یا کوچک جلوه نکند.

from PIL import Image

def add_logo_watermark(input_image_path, output_image_path, logo_path, scale_percent=20, margin=20):
# باز کردن تصویر پس‌زمینه اصلی و لوگو
base_image = Image.open(input_image_path).convert(“RGBA”)
logo = Image.open(logo_path).convert(“RGBA”)

base_width, base_height = base_image.size
logo_width, logo_height = logo.size

# محاسبه عرض و ارتفاع جدید لوگو بر اساس درصدی از عرض تصویر اصلی
new_logo_width = int(base_width * (scale_percent / 100))
new_logo_height = int(logo_height * (new_logo_width / logo_width))

# تغییر اندازه لوگو با استفاده از بهترین فیلتر کیفیت تصویر
resized_logo = logo.resize((new_logo_width, new_logo_height), Image.Resampling.LANCZOS)

# محاسبه مختصات گوشه پایین سمت راست با حاشیه مشخص‌شده
position_x = base_widthnew_logo_widthmargin
position_y = base_heightnew_logo_heightmargin

# چسباندن لوگو روی تصویر با استفاده از آلفا ماسک خود لوگو (حفظ شفافیت)
base_image.paste(resized_logo, (position_x, position_y), resized_logo)

# ذخیره خروجی به فرمت مورد نظر
base_image.convert(“RGB”).save(output_image_path, “JPEG”)
print(f”لوگو با موفقیت در موقعیت راست-پایین روی تصویر درج شد.”)

# مثال استفاده:
# add_logo_watermark(“product.jpg”, “product_watermarked.jpg”, “logo.png”, scale_percent=15, margin=30)

۵. کد آماده پردازش گروهی و خودکار تصاویر یک پوشه

کدهای آماده ساخت واترمارک روی تصویر با پایتون — تصویر 5

قدرت واقعی برنامه‌نویسی پایتون زمانی مشخص می‌شود که شما بخواهید صدها یا هزاران تصویر محصول را در چند ثانیه واترمارک کنید. برای این کار، ما از کتابخانه‌های داخلی سیستم‌عامل پایتون یعنی os برای اسکن و پیمایش پوشه‌ها استفاده می‌کنیم.

کد زیر تمامی تصاویر با پسوند‌های رایج موجود در یک پوشه ورودی را پیدا کرده، واترمارک تصویری یا متنی را به آن‌ها اضافه می‌کند و خروجی‌ها را درون یک پوشه جدید مجزا به شما تحویل می‌دهد تا تصاویر اصلی بدون تغییر باقی بمانند.

import os
from PIL import Image

def batch_watermark(input_folder, output_folder, logo_path):
# ایجاد پوشه خروجی در صورت عدم وجود
if not os.path.exists(output_folder):
os.makedirs(output_folder)

# فرمت‌های تصویری مجاز برای پردازش
valid_extensions = (“.jpg”, “.jpeg”, “.png”, “.webp”)

# پیمایش تمام فایل‌های داخل پوشه ورودی
for filename in os.listdir(input_folder):
if filename.lower().endswith(valid_extensions):
input_path = os.path.path.join(input_folder, filename)
output_path = os.path.path.join(output_folder, filename)

try:
# فراخوانی تابع قرار دادن واترمارک روی تک عکس
add_logo_watermark(input_path, output_path, logo_path, scale_percent=12)
print(f”موفقیت‌آمیز: {filename} پردازش شد.”)
except Exception as e:
print(f”خطا در پردازش تصویر {filename}: {str(e)})

# برای استفاده:
# batch_watermark(“my_photos”, “watermarked_photos”, “my_logo.png”)

۶. جدول مقایسه روش‌های واترمارک

بسیاری از توسعه‌دهندگان در انتخاب بین استفاده از واترمارک متنی و واترمارک لوگو تردید دارند. جدول مقایسه‌ای زیر با بررسی دقیق فاکتورهای مختلف به شما کمک می‌کند تا بر اساس سناریوی کاری خود بهترین انتخاب را داشته باشید.

معیار بررسی واترمارک متنی (Text) واترمارک تصویری (Logo)
سرعت پردازش بسیار سریع (نیاز به منابع کم سیستم) کمی کندتر به دلیل لود و ریسایز لوگو
امنیت و ضد سرقت بودن متوسط (امکان حذف راحت‌تر با ابزار کلون) بسیار بالا (به ویژه با لوگوهای نیمه‌شفاف بزرگ)
زیبایی‌شناسی بصری ساده و خلوت (مناسب تصاویر مینیمال) حرفه‌ای و عالی برای برندسازی تجاری
سهولت تغییر متن/محتوا بسیار آسان (تنها تغییر یک رشته متن در کد) نیاز به طراحی فایل جدید لوگو در فتوشاپ

۷. عیب‌یابی سریع و رفع خطاهای رایج

در مسیر اجرای کدهای مربوط به پردازش تصویر در پایتون، ممکن است با چند خطای متداول روبرو شوید. در این بخش راه‌حل‌های سریع و تست‌شده برای این مشکلات را گردآوری کرده‌ایم:

  • خطای OSError: cannot open resource (عدم شناسایی فونت): این خطا زمانی رخ می‌دهد که پایتون نمی‌تواند فایل فونت معرفی‌شده را در مسیر مشخص‌شده پیدا کند. برای حل این مشکل، همواره از آدرس‌دهی مطلق (مانند C:/Windows/Fonts/tahoma.ttf در ویندوز) استفاده کنید یا فایل فونت را دقیقاً کنار فایل کد پایتون خود قرار دهید.
  • سیاه شدن پس‌زمینه تصاویر شفاف (PNG): هنگام ذخیره خروجی با فرمت JPEG، از آنجایی که این فرمت از آلفا چنل (شفافیت) پشتیبانی نمی‌کند، پس‌زمینه شفاف به رنگ سیاه یا سفید در می‌آید. راه‌حل این است که حتماً تصویر نهایی را قبل از ذخیره به فرمت “RGB” تبدیل کنید (کدهای بالا این کار را برای شما به صورت پیش‌فرض انجام می‌دهند).
  • خطای نامتقارن بودن ابعاد لوگو روی عکس‌های عمودی و افقی: اگر ابعاد لوگو را ثابت در نظر بگیرید، روی عکس‌های عمودی بزرگتر و روی افقی‌ها کوچکتر دیده می‌شود. استفاده از متغیر scale_percent در کدهای ارائه شده ما این مشکل را کاملاً برطرف می‌کند.

۸. پرسش‌های متداول

۱. چطور می‌توانم فونت فارسی برای واترمارک متنی استفاده کنم؟

پایتون و کتابخانه Pillow به طور بومی فونت‌های فارسی را به درستی پشتیبانی نمی‌کنند و کلمات را جدا می‌نویسند. برای حل این مشکل، باید از کتابخانه کمکی arabic_reshaper و bidi.algorithm در کنار کدهای بالا استفاده کنید تا متون فارسی راست به چپ و پیوسته شوند.

۲. آیا استفاده از پایتون سرعت مناسبی برای پردازش تعداد زیادی تصویر دارد؟

بله، کتابخانه Pillow از هسته نوشته‌شده با زبان C بهره می‌برد و بسیار سریع است. برای پردازش چندهزار تصویر می‌توانید با استفاده از کتابخانه multiprocessing پایتون، کار را به هسته‌های مختلف پردازنده بسپارید و زمان انجام کار را به کمتر از نصف کاهش دهید.

۳. چطور می‌توانم لوگو را در نقطه‌ای غیر از گوشه پایین تصویر قرار دهم؟

کافی است فرمول مختصات position_x و position_y را تغییر دهید. مثلاً برای قرار دادن در مرکز تصویر، عرض عکس اصلی را منهای عرض لوگو کرده و تقسیم بر دو کنید.

۴. آیا با تغییر فرمت به JPEG کیفیت افت خواهد کرد؟

در زمان ذخیره خروجی می‌توانید پارامتر quality=95 را به متد save() اضافه کنید تا کیفیت تصویر خروجی در بالاترین سطح ممکن حفظ شود.

Table of Contents

آخرین نوشته‌ها