پروژه دهم پایتون : ساخت یک ویرایشگر عکس

خب سلام ، امروز میخوام با پایتون آموزش ساخت یک ویرایشگر عکس که حتما بدردتون میخورد بسازیم .

وسایل مورد نیاز :

1-پایتون

2-کتابخانه tkinter

3-کتابخانه PIL

4-کتابخانه ttkbootstrap

5-کتابخانه ttkbootstrap.constants

6-کتابخانه os

خب بعد از نصب کتابخانه های لازم کد زیر را در پایتون وارد میکنیم :

import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
import ttkbootstrap as tb
from ttkbootstrap.constants import *
import os

class LiveImageResizer:
    def __init__(self, root):
        self.root = root
        self.root.title("ويرايشگر عکس")
        self.root.geometry("850x650")

        self.image_path = None
        self.original_img = None
        self.preview_img = None

        # طراحی صفحه: دو ستون
        main_frame = tb.Frame(root, padding=10)
        main_frame.pack(fill=BOTH, expand=True)

        # پنل کنترل (سمت راست)
        control_panel = tb.Frame(main_frame, width=250)
        control_panel.pack(side=LEFT, fill=Y, padx=10)

        tb.Label(control_panel, text="تنظیمات حرفه‌ای", font=("Tahoma", 14, "bold")).pack(pady=10)
        
        self.btn_select = tb.Button(control_panel, text="انتخاب تصویر", command=self.load_image, bootstyle="info")
        self.btn_select.pack(fill=X, pady=5)

        # ابعاد
        tb.Label(control_panel, text="عرض جدید:").pack(anchor="w", pady=(10, 0))
        self.w_entry = tb.Entry(control_panel)
        self.w_entry.pack(fill=X, pady=5)
        self.w_entry.bind("<KeyRelease>", self.update_preview)

        tb.Label(control_panel, text="ارتفاع جدید:").pack(anchor="w", pady=(10, 0))
        self.h_entry = tb.Entry(control_panel)
        self.h_entry.pack(fill=X, pady=5)
        self.h_entry.bind("<KeyRelease>", self.update_preview)

        # انتخاب پسوند
        tb.Label(control_panel, text="پسوند خروجی:").pack(anchor="w", pady=(10, 0))
        self.fmt_combo = tb.Combobox(control_panel, values=[".png", ".jpg", ".jpeg", ".bmp", ".webp"], state="readonly")
        self.fmt_combo.current(0)
        self.fmt_combo.pack(fill=X, pady=5)
        self.fmt_combo.bind("<<ComboboxSelected>>", self.update_preview)

        self.btn_save = tb.Button(control_panel, text="ذخیره نهایی", command=self.save_image, bootstyle="success")
        self.btn_save.pack(side=BOTTOM, fill=X, pady=20)

        # پنل پیش‌نمایش
        self.preview_canvas = tb.Label(main_frame, text="پیش‌نمایش", borderwidth=2, relief="sunken", anchor="center")
        self.preview_canvas.pack(side=RIGHT, fill=BOTH, expand=True, padx=10)

    def load_image(self):
        self.image_path = filedialog.askopenfilename(filetypes=[("Image files", "*.png *.jpg *.jpeg *.bmp *.webp")])
        if self.image_path:
            self.original_img = Image.open(self.image_path)
            self.w_entry.delete(0, END); self.w_entry.insert(0, str(self.original_img.width))
            self.h_entry.delete(0, END); self.h_entry.insert(0, str(self.original_img.height))
            self.update_preview()

    def update_preview(self, event=None):
        if not self.original_img: return
        try:
            w, h = int(self.w_entry.get()), int(self.h_entry.get())
            # پیش‌نمایش با ابعاد جدید
            img = self.original_img.resize((w, h), Image.Resampling.LANCZOS)
            
            # اگر فرمت JPG است و تصویر Transparent است، برای نمایش پیش‌نمایش پس‌زمینه سفید می‌گذاریم
            if self.fmt_combo.get() in [".jpg", ".jpeg"] and img.mode in ("RGBA", "LA"):
                background = Image.new("RGB", img.size, (255, 255, 255))
                background.paste(img, mask=img.split()[3])
                img = background

            display_img = img.copy()
            display_img.thumbnail((450, 450)) 
            self.preview_img = ImageTk.PhotoImage(display_img)
            self.preview_canvas.config(image=self.preview_img, text="")
        except:
            pass

    def save_image(self):
        if not self.original_img: return
        try:
            w, h = int(self.w_entry.get()), int(self.h_entry.get())
            ext = self.fmt_combo.get()
            final_img = self.original_img.resize((w, h), Image.Resampling.LANCZOS)
            
            save_path = filedialog.asksaveasfilename(defaultextension=ext, filetypes=[("Image", f"*{ext}")])
            if save_path:
                # مدیریت تبدیل مود تصویر برای فرمت‌های خاص
                if ext in [".jpg", ".jpeg"] and final_img.mode in ("RGBA", "P"):
                    final_img = final_img.convert("RGB")
                
                final_img.save(save_path)
                messagebox.showinfo("موفقیت", f"تصویر با فرمت {ext} ذخیره شد!")
        except Exception as e:
            messagebox.showerror("خطا", f"عملیات ناموفق بود: {e}")

if __name__ == "__main__":
    root = tb.Window(themename="superhero")
    app = LiveImageResizer(root)
    root.mainloop()

خب این هم از پروژه امروز ما

کانال روبیکا من : کانال روبیکا من : https://rubika.ir/artinkarimian3

اگر ایده یا پروژه ای دارید از طریق لینک زیر :
https://formafzar.com/form/zso58
پیام خود را وارد کنید راستی به تمام سوالات شما پاسخ داده میشود .

رمز داخل سایت (جهت نیاز) : artinkarimian125701