
خب سلام ، امروز میخوام با پایتون آموزش ساخت یک ویرایشگر عکس که حتما بدردتون میخورد بسازیم .
وسایل مورد نیاز :
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