Untitled
unknown
plain_text
a year ago
9.4 kB
15
Indexable
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageTk
class ImageResizerApp:
def __init__(self, root):
self.root = root
self.root.title("Image Resizer")
self.root.geometry("1200x800")
self.root.configure(bg="#f0f0f0")
# Use ttk Style to set a modern theme
style = ttk.Style()
style.theme_use("clam")
style.configure("TFrame", background="#f0f0f0")
style.configure("TLabel", background="#f0f0f0", font=("Helvetica", 12))
style.configure("TButton", padding=10, font=("Helvetica", 12, "bold"), foreground="#ffffff")
style.map("TButton",
background=[("active", "#1e90ff"), ("!active", "#0073e6")],
relief=[("pressed", "groove"), ("!pressed", "flat")])
self.images = [] # List of loaded images
self.image_paths = [] # List of image paths
self.current_image_index = None
# Main Frame
main_frame = ttk.Frame(root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# Upload button
self.upload_btn = ttk.Button(main_frame, text="Upload Images", command=self.upload_images)
self.upload_btn.grid(row=0, column=0, pady=10, sticky=tk.W)
# Thumbnails frame
self.thumbnail_frame = ttk.Frame(main_frame)
self.thumbnail_frame.grid(row=1, column=0, columnspan=3, pady=10, sticky=tk.W)
# Canvas for image preview with border
self.canvas_frame = ttk.Frame(main_frame, width=400, height=400, relief="sunken", borderwidth=2)
self.canvas_frame.grid(row=2, column=0, columnspan=3, pady=10)
self.canvas = tk.Canvas(self.canvas_frame, width=350, height=350, bg="white", highlightthickness=0)
self.canvas.pack()
# Resize controls frame
controls_frame = ttk.Frame(main_frame, padding="10")
controls_frame.grid(row=3, column=0, columnspan=3, pady=10)
# Width and Height Labels and Entries
self.width_label = ttk.Label(controls_frame, text="Width:")
self.width_label.grid(row=0, column=0, sticky=tk.W, padx=5)
self.width_entry = ttk.Entry(controls_frame, width=10)
self.width_entry.grid(row=0, column=1, padx=5)
self.width_entry.bind("<KeyRelease>", self.update_from_width)
self.height_label = ttk.Label(controls_frame, text="Height:")
self.height_label.grid(row=1, column=0, sticky=tk.W, padx=5)
self.height_entry = ttk.Entry(controls_frame, width=10)
self.height_entry.grid(row=1, column=1, padx=5)
self.height_entry.bind("<KeyRelease>", self.update_from_height)
# Resize Percentage
self.percentage_label = ttk.Label(controls_frame, text="Resize Percentage:")
self.percentage_label.grid(row=2, column=0, sticky=tk.W, padx=5)
self.percentage_entry = ttk.Entry(controls_frame, width=10)
self.percentage_entry.insert(0, "100") # Set default percentage to 100%
self.percentage_entry.grid(row=2, column=1, padx=5)
self.percentage_entry.bind("<KeyRelease>", self.update_dimensions_from_percentage)
# Resize button with modern styling
self.resize_btn = ttk.Button(main_frame, text="Resize Image", command=self.resize_image, style="TButton")
self.resize_btn.grid(row=4, column=0, pady=10, sticky=tk.W)
# Download button with modern styling
self.download_btn = ttk.Button(main_frame, text="Download Image", command=self.download_image, style="TButton")
self.download_btn.grid(row=4, column=1, pady=10, sticky=tk.W)
def upload_images(self):
file_paths = filedialog.askopenfilenames(filetypes=[("Image files", "*.jpg;*.jpeg;*.png;*.bmp;*.tiff")])
if file_paths:
for file_path in file_paths:
self.image_paths.append(file_path)
self.images.append(Image.open(file_path))
self.add_thumbnail(len(self.images) - 1)
def add_thumbnail(self, index):
img = self.images[index].copy()
img.thumbnail((150, 150))
tk_img = ImageTk.PhotoImage(img)
# Create a button with the thumbnail image
thumb_button = tk.Button(self.thumbnail_frame, image=tk_img, command=lambda idx=index: self.on_thumbnail_click(idx))
thumb_button.image = tk_img # Keep a reference to avoid garbage collection
thumb_button.grid(row=index // 5, column=index % 5, padx=10, pady=10)
# Overlay the width and height text on each thumbnail
width, height = self.images[index].size
dimension_label = tk.Label(self.thumbnail_frame, text=f"{width}x{height}", font=("Helvetica", 8), bg="white")
dimension_label.place(in_=thumb_button, relx=0.5, rely=0.9, anchor="center")
def on_thumbnail_click(self, index):
self.current_image_index = index
self.show_image(index)
self.update_resize_fields(index)
def show_image(self, index):
if 0 <= index < len(self.images):
img_copy = self.images[index].copy()
img_copy.thumbnail((350, 350))
self.tk_image = ImageTk.PhotoImage(img_copy)
self.canvas.delete("all")
self.canvas.create_image(175, 175, image=self.tk_image, anchor="center")
def update_resize_fields(self, index):
# Set width and height text fields with original dimensions
if 0 <= index < len(self.images):
image = self.images[index]
self.width_entry.delete(0, tk.END)
self.width_entry.insert(0, str(image.width))
self.height_entry.delete(0, tk.END)
self.height_entry.insert(0, str(image.height))
# Set percentage to 100% for the selected image
self.percentage_entry.delete(0, tk.END)
self.percentage_entry.insert(0, "100")
def update_dimensions_from_percentage(self, event):
if self.current_image_index is not None:
try:
percentage = float(self.percentage_entry.get()) / 100.0
image = self.images[self.current_image_index]
new_width = int(image.width * percentage)
new_height = int(image.height * percentage)
self.width_entry.delete(0, tk.END)
self.width_entry.insert(0, str(new_width))
self.height_entry.delete(0, tk.END)
self.height_entry.insert(0, str(new_height))
except ValueError:
pass
def update_from_width(self, event):
if self.current_image_index is not None:
try:
new_width = int(self.width_entry.get())
image = self.images[self.current_image_index]
percentage = new_width / image.width
new_height = int(image.height * percentage)
self.height_entry.delete(0, tk.END)
self.height_entry.insert(0, str(new_height))
self.percentage_entry.delete(0, tk.END)
self.percentage_entry.insert(0, str(int(percentage * 100)))
except ValueError:
pass
def update_from_height(self, event):
if self.current_image_index is not None:
try:
new_height = int(self.height_entry.get())
image = self.images[self.current_image_index]
percentage = new_height / image.height
new_width = int(image.width * percentage)
self.width_entry.delete(0, tk.END)
self.width_entry.insert(0, str(new_width))
self.percentage_entry.delete(0, tk.END)
self.percentage_entry.insert(0, str(int(percentage * 100)))
except ValueError:
pass
def resize_image(self):
if self.current_image_index is not None:
width = self.width_entry.get()
height = self.height_entry.get()
if width and height:
try:
width = int(width)
height = int(height)
self.images[self.current_image_index] = self.images[self.current_image_index].resize((width, height), Image.LANCZOS)
# Display success message
messagebox.showinfo("Success", "Image resized successfully.")
self.show_image(self.current_image_index)
except ValueError:
messagebox.showerror("Error", "Invalid width or height values.")
def download_image(self):
if self.current_image_index is not None:
save_path = filedialog.asksaveasfilename(defaultextension=".png",
filetypes=[("PNG files", "*.png"),
("JPEG files", "*.jpg"),
("All files", "*.*")])
if save_path:
self.images[self.current_image_index].save(save_path)
if __name__ == "__main__":
root = tk.Tk()
app = ImageResizerApp(root)
root.mainloop()
Editor is loading...
Leave a Comment