روبیکا من : https://rubika.ir/artinkarimian3 سایت من : https://sites.google.com/view/artin-karimian
پروژه دهم پایتون : ساخت یک ویرایشگر عکس

خب سلام ، امروز میخوام با پایتون آموزش ساخت یک ویرایشگر عکس که حتما بدردتون میخورد بسازیم .
وسایل مورد نیاز :
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
مطلبی دیگر از این انتشارات
پروژه ششم پایتون : تشخیص لبخند
مطلبی دیگر از این انتشارات
پروژه دوم پایتون : ساعت جهانی
مطلبی دیگر از این انتشارات
آموزش ساخت ویروس کامپیوتری (Fork Bomb) به 3 روش