This FREE Image Editor is INSANE in 2025! πŸ”₯ | Fuzzu Modern Image Editor

 Demo :


Click Video πŸ‘‡πŸ‘‡πŸ‘‡




















Code :


import tkinter as tk

from tkinter import filedialog, messagebox

from PIL import Image, ImageTk, ImageEnhance, ImageFilter


class ImageEditorApp:

    def __init__(self, root):

        self.root = root

        self.root.title("Fuzzu Modern Image Editor")

        self.root.geometry("900x700")

        self.root.configure(bg="#1e1e1e")


        self.image_path = None

        self.original_image = None

        self.display_image = None

        self.last_filter = None


        self.create_widgets()


    def create_widgets(self):

        self.canvas = tk.Canvas(self.root, bg="#000000")

        self.canvas.pack(pady=20, fill="both", expand=True)


        self.btn_frame = tk.Frame(self.root, bg="#1e1e1e")

        self.btn_frame.pack(pady=10)


        load_btn = tk.Button(self.btn_frame, text="Load Image", command=self.load_image, bg="#444", fg="white")

        load_btn.grid(row=0, column=0, padx=10)


        save_btn = tk.Button(self.btn_frame, text="Save Image", command=self.save_image, bg="#444", fg="white")

        save_btn.grid(row=0, column=1, padx=10)


        crop_btn = tk.Button(self.btn_frame, text="Crop Image", command=self.crop_image, bg="#444", fg="white")

        crop_btn.grid(row=0, column=2, padx=10)


        reset_btn = tk.Button(self.btn_frame, text="Reset Image", command=self.reset_image, bg="#444", fg="white")

        reset_btn.grid(row=0, column=3, padx=10)


        self.filter_frame = tk.Frame(self.root, bg="#1e1e1e")

        self.filter_frame.pack(pady=5)


        self.add_filter_button("Blur", self.apply_blur, 0)

        self.add_filter_button("Edge Enhance", self.apply_edge_enhance, 1)


    def add_filter_button(self, text, command, column):

        def show_slider():

            if hasattr(self, 'slider') and self.slider.winfo_exists():

                self.slider.destroy()


            self.slider = tk.Scale(self.root, from_=0, to=100, orient="horizontal", bg="#2e2e2e", fg="white", 

                                    highlightthickness=0, troughcolor="#555", length=300, label=f"{text} Level (%)")

            self.slider.set(50)

            self.slider.pack(pady=10)


            def apply():

                value = self.slider.get()

                command(value)


            apply_btn = tk.Button(self.root, text=f"Apply {text}", command=apply, bg="#444", fg="white")

            apply_btn.pack()


        btn = tk.Button(self.filter_frame, text=text, command=show_slider, bg="#444", fg="white")

        btn.grid(row=0, column=column, padx=10)


    def load_image(self):

        file_path = filedialog.askopenfilename()

        if not file_path:

            return

        try:

            self.image_path = file_path

            self.original_image = Image.open(file_path)

            self.display_image = self.original_image.copy()

            self.show_image()

        except Exception as e:

            messagebox.showerror("Error", f"Unable to load image: {e}")


    def show_image(self):

        if self.display_image:

            img = self.display_image.copy()

            img.thumbnail((800, 500))

            self.tk_image = ImageTk.PhotoImage(img)

            self.canvas.delete("all")

            self.canvas.create_image(self.canvas.winfo_width() // 2, self.canvas.winfo_height() // 2, image=self.tk_image, anchor="center")


    def save_image(self):

        if self.display_image:

            file_path = filedialog.asksaveasfilename(defaultextension=".png")

            if file_path:

                self.display_image.save(file_path)

                messagebox.showinfo("Saved", "Image saved successfully!")


    def reset_image(self):

        if self.original_image:

            self.display_image = self.original_image.copy()

            self.show_image()


    def crop_image(self):

        if not self.display_image:

            messagebox.showerror("Error", "No image loaded.")

            return


        crop_window = tk.Toplevel(self.root)

        crop_window.title("Crop Image - Fuzzu Crop Tool")

        crop_window.geometry("600x600")

        crop_window.config(bg="#1e1e1e")


        canvas = tk.Canvas(crop_window, bg="black", cursor="cross")

        canvas.pack(fill="both", expand=True)


        img = self.display_image.copy()

        img.thumbnail((600, 600))

        img_tk = ImageTk.PhotoImage(img)

        canvas.image = img_tk

        canvas.create_image(0, 0, anchor="nw", image=img_tk)


        self.crop_start = None

        self.crop_rect = None


        def on_mouse_down(event):

            self.crop_start = (event.x, event.y)

            if self.crop_rect:

                canvas.delete(self.crop_rect)

            self.crop_rect = canvas.create_rectangle(event.x, event.y, event.x, event.y, outline="red", width=2)


        def on_mouse_drag(event):

            if self.crop_start:

                canvas.coords(self.crop_rect, self.crop_start[0], self.crop_start[1], event.x, event.y)


        def crop_and_apply():

            if not self.crop_rect:

                messagebox.showwarning("Warning", "No crop area selected.")

                return

            x1, y1, x2, y2 = canvas.coords(self.crop_rect)

            scale_x = self.display_image.width / img.width

            scale_y = self.display_image.height / img.height

            left = int(min(x1, x2) * scale_x)

            upper = int(min(y1, y2) * scale_y)

            right = int(max(x1, x2) * scale_x)

            lower = int(max(y1, y2) * scale_y)


            try:

                self.display_image = self.display_image.crop((left, upper, right, lower))

                self.last_filter = None

                self.show_image()

                crop_window.destroy()

            except Exception as e:

                messagebox.showerror("Error", f"Invalid crop area: {e}")


        canvas.bind("<Button-1>", on_mouse_down)

        canvas.bind("<B1-Motion>", on_mouse_drag)


        crop_btn = tk.Button(crop_window, text="Crop", command=crop_and_apply, bg="#4b4b4b", fg="white")

        crop_btn.pack(pady=10)


    def apply_blur(self, level):

        if level == 0:

            self.display_image = self.original_image.copy()

        else:

            radius = level / 10

            self.display_image = self.original_image.copy().filter(ImageFilter.GaussianBlur(radius))

        self.show_image()


    def apply_edge_enhance(self, level):

        if level == 0:

            self.display_image = self.original_image.copy()

        else:

            self.display_image = self.original_image.copy()

            for _ in range(level // 25):

                self.display_image = self.display_image.filter(ImageFilter.EDGE_ENHANCE)

        self.show_image()


if __name__ == "__main__":

    root = tk.Tk()

    app = ImageEditorApp(root)

    root.mainloop()

Comments

Popular posts from this blog

πŸš€ Simple Login & Registration System in Python Tkinter πŸ“±

πŸš€ Create a Python Screen Recorder with Audio (Complete Code)

Python IP Tracker App with GUI | Track IP Location Real-Time! (Working Project)