Skip to content

Commit

Permalink
configure alpha channel
Browse files Browse the repository at this point in the history
  • Loading branch information
tyshoe committed Mar 19, 2024
1 parent 9b18714 commit 5496422
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 254 deletions.
158 changes: 9 additions & 149 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import customtkinter as ctk
from tkinter import StringVar, IntVar, DoubleVar # Add DoubleVar
from tkinter import StringVar, IntVar, DoubleVar
from PIL import Image, ImageTk
from canvas import *
from menu import Menu
Expand Down Expand Up @@ -32,7 +32,7 @@ def __init__(self):
self.canvas_width = 0
self.canvas_height = 0

self.menu = Menu(self, self.channels_var, self.alpha_var, self.r_var, self.g_var, self.b_var, self.manipulate_image, import_image=self.import_image)
self.menu = Menu(self, self.channels_var, self.r_var, self.g_var, self.b_var, self.a_var, self.manipulate_image, import_image=self.import_image)
# print(self.alpha_var.get())

# run
Expand All @@ -42,7 +42,7 @@ def init_parameters(self):
self.r_var = IntVar(value=0)
self.g_var = IntVar(value=0)
self.b_var = IntVar(value=0)
self.alpha_var = DoubleVar(value=1.0)
self.a_var = DoubleVar(value=0.0)

self.channels_var = StringVar(value = CHANNELS[0])

Expand All @@ -53,19 +53,11 @@ def import_image(self, path):
self.image_tk = ImageTk.PhotoImage(self.image)

self.image_output = ImageOutput(self, self.resize_image)
self.menu = Menu(self, self.channels_var, self.alpha_var, self.r_var, self.g_var, self.b_var, self.manipulate_image, import_image=self.import_image, export_image=self.export_image)
self.menu = Menu(self, self.channels_var, self.r_var, self.g_var, self.b_var, self.a_var, self.manipulate_image, import_image=self.import_image, export_image=self.export_image)

def manipulate_image(self, *args):
self.image = self.original

# self.image
# def applyRGB(self, image, r_var, g_var, b_var, channels_var):
#TODO apply RGB to image

# print(f'R:{r_var.get()} G:{g_var.get()} B:{b_var.get()} Channel:{channels_var.get()} ')
# print(image)
# print(type(self.image))

def within_range(pixel, r_range, g_range, b_range):
r, g, b, _ = pixel
return r_range[0] <= r <= r_range[1] and g_range[0] <= g <= g_range[1] and b_range[0] <= b <= b_range[1]
Expand All @@ -89,10 +81,10 @@ def convert_pixel(pixel):
if within_range(pixel, (r_min_val, r_max_val), (g_min_val, g_max_val), (b_min_val, b_max_val)):
# Add the specified values to the R, G, B, and A channels
r, g, b, a = pixel
r += self.r_var.get()
g += self.g_var.get()
b += self.b_var.get()
a += 0 #TODO: set this up
r = self.r_var.get()
g = self.g_var.get()
b = self.b_var.get()
a += self.a_var.get()

# Limit the values to be in the range of 0 to 255 and 0.0 to 1.0
r = max(0, min(255, int(r)))
Expand Down Expand Up @@ -126,7 +118,6 @@ def convert_pixel(pixel):
self.place_image()

def resize_image(self, event):

# get canvas ratio
canvas_ratio = event.width / event.height

Expand All @@ -151,140 +142,9 @@ def place_image(self):
self.image_output.create_image(
self.canvas_width/2, self.canvas_height/2, image=self.image_tk)


def export_image(self, name, file, path):
export_string = f'{path}/{name}.{file}'
self.image.save(export_string)




app = App()

# OLD CODE BELOW HERE

# def identify_channels():
# if image:
# if image.mode == "RGBA":
# return True
# elif image.mode == "RGB":
# return False

# def apply_color():
# global image, modified_image

# def within_range(pixel, r_range, g_range, b_range):
# r, g, b, _ = pixel
# return r_range[0] <= r <= r_range[1] and g_range[0] <= g <= g_range[1] and b_range[0] <= b <= b_range[1]

# if image:
# r_min_val, r_max_val = r_min.get(), r_max.get()
# g_min_val, g_max_val = g_min.get(), g_max.get()
# b_min_val, b_max_val = b_min.get(), b_max.get()
# a_val = add_alpha_var.get() # Value of channel A

# # Function to convert a pixel to a new pixel
# def convert_pixel(pixel):
# nonlocal r_min_val, r_max_val, g_min_val, g_max_val, b_min_val, b_max_val, a_val
# if within_range(pixel, (r_min_val, r_max_val), (g_min_val, g_max_val), (b_min_val, b_max_val)):
# # Add the specified values to the R, G, B, and A channels
# r, g, b, a = pixel
# r += add_r_var.get()
# g += add_g_var.get()
# b += add_b_var.get()
# a += a_val

# # Limit the values to be in the range of 0 to 255 and 0.0 to 1.0
# r = max(0, min(255, int(r)))
# g = max(0, min(255, int(g)))
# b = max(0, min(255, int(b)))
# # Scale float alpha to integer range (0-255)
# a = max(0, min(255, int(a * 255)))

# # Check the choice of channel order
# if order_var.get() == "RGBA":
# return (r, g, b, a)
# elif order_var.get() == "RBGA":
# return (r, b, g, a)
# elif order_var.get() == "BGRA":
# return (b, g, r, a)
# elif order_var.get() == "BRGA":
# return (b, r, g, a)
# elif order_var.get() == "GRBA":
# return (g, r, b, a)
# elif order_var.get() == "GBRA":
# return (g, b, r, a)
# return pixel

# # Apply color substitution to the image
# modified_image = image.convert(
# "RGBA" if identify_channels() else "RGB")
# modified_image.putdata(list(map(convert_pixel, image.getdata())))

# # Display the modified image
# image_tk = ImageTk.PhotoImage(modified_image)
# image_label.configure(image=image_tk)
# image_label.image = image_tk

# def create_range_frame():
# range_frame = ctk.CTkFrame(root)
# range_frame.pack()

# # Configuration for the R channel (red)
# r_label = ctk.CTkLabel(range_frame, text="R Channel:")
# r_label.pack(side=ctk.LEFT)

# r_min_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Min")
# r_min_scale.pack(side=ctk.LEFT)

# r_max_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Max")
# r_max_scale.pack(side=ctk.LEFT)

# # Configuration for the G channel (green)
# g_label = ctk.CTkLabel(range_frame, text="G Channel:")
# g_label.pack(side=ctk.LEFT)

# g_min_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Min")
# g_min_scale.pack(side=ctk.LEFT)

# g_max_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Max")
# g_max_scale.pack(side=ctk.LEFT)

# # Configuration for the B channel (blue)
# b_label = ctk.CTkLabel(range_frame, text="B Channel:")
# b_label.pack(side=ctk.LEFT)

# b_min_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Min")
# b_min_scale.pack(side=ctk.LEFT)

# b_max_scale = Scale(range_frame, from_=0, to=255,
# orient=ctk.HORIZONTAL, length=200, label="Max")
# b_max_scale.pack(side=ctk.LEFT)

# return r_min_scale, r_max_scale, g_min_scale, g_max_scale, b_min_scale, b_max_scale

# # Create a frame for widgets
# frame = ctk.CTkFrame(root)
# frame.pack()

# # Create a button to apply color substitution
# apply_button = ctk.CTkButton(frame, text="Apply color", command=apply_color)
# apply_button.grid(row=3, column=0, padx=20, pady=20)

# # Create a range frame
# r_min, r_max, g_min, g_max, b_min, b_max = create_range_frame()

# # Create variables to store the choice of order and values to add
# order_var = StringVar(value="RGBA")
# add_r_var = IntVar(value=0)
# add_g_var = IntVar(value=0)
# add_b_var = IntVar(value=0)

# add_button = ctk.CTkButton(frame, text="Adjust RGB",
# command=open_add_values_window)
# add_button.grid(row=2, column=1, padx=20, pady=20)
app = App()
12 changes: 4 additions & 8 deletions menu.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import customtkinter as ctk
from canvas import *
from PIL import Image, ImageTk
from panels import *
from settings import *


class Menu(ctk.CTkTabview):
def __init__(self, parent, channels_var, alpha_var, r_var, g_var, b_var, manipulate_image, import_image='', export_image=''):
def __init__(self, parent, channels_var, r_var, g_var, b_var, a_var, manipulate_image, import_image='', export_image=''):
super().__init__(master=parent)
self.grid(column=0, row=0, sticky='nsew', padx=10, pady=10)

Expand All @@ -15,11 +14,9 @@ def __init__(self, parent, channels_var, alpha_var, r_var, g_var, b_var, manipul
self.add("Edit")
self.add("Export")

# print(alpha_var.get())

# Widgets
ImportFrame(self.tab('Import'), import_image)
EditFrame(self.tab('Edit'), channels_var, alpha_var, r_var, g_var, b_var, manipulate_image)
EditFrame(self.tab('Edit'), channels_var, r_var, g_var, b_var, a_var, manipulate_image)
ExportFrame(self.tab('Export'), export_image)


Expand All @@ -32,13 +29,12 @@ def __init__(self, parent, import_image):


class EditFrame(ctk.CTkFrame):
def __init__(self, parent, channels_var, alpha_var, r_var, g_var, b_var, manipulate_image):
def __init__(self, parent, channels_var, r_var, g_var, b_var, a_var, manipulate_image):
super().__init__(master=parent, fg_color='transparent')
self.pack(expand=True, fill='both')

DropdownPanel(self, channels_var, CHANNELS)
ColorPanel(self, r_var, g_var, b_var, manipulate_image)
AlphaPanel(self, alpha_var)
ColorPanel(self, r_var, g_var, b_var, a_var, manipulate_image)


class ExportFrame(ctk.CTkFrame):
Expand Down
109 changes: 13 additions & 96 deletions panels.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,38 +107,11 @@ def __init__(self, parent, data_var, options):
self.pack(fill='x', pady=4)

def updateChannel(self, parent):
# print('self: ' + str(self), 'parent' + str(parent))
self._variable.set(parent)
# print(self._variable.get())

class AlphaPanel(Panel):
def __init__(self, parent, data_var):
super().__init__(parent=parent)
self.pack(fill='x', pady=4)

self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1, uniform='a')
self.columnconfigure(1, weight=3, uniform='a')

label = ctk.CTkLabel(self, text="Alpha")
label.grid(column=0, row=0, pady=5, sticky='E')
alpha = ctk.CTkEntry(self, placeholder_text="1.0", textvariable=data_var)
alpha.grid(column=1, row=0, pady=5)
alpha_slider = ctk.CTkSlider(self, from_=ALPHA_MIN, to=ALPHA_MAX, width=200, variable=data_var)
alpha_slider.grid(column=0, row=1, columnspan=2, pady=(0, 10))

add_alpha_button = ctk.CTkButton(self, text="Apply Alpha", command=self.applyAlpha)
add_alpha_button.grid(column=0, row=2, columnspan=2, pady=(0, 10))

def applyAlpha(self):
#TODO apply alpha to image
pass
# print(type(alpha))
# self.data_var.set(alpha)


class ColorPanel(Panel):
def __init__(self, parent, r_var, g_var, b_var, manipulate_image):
def __init__(self, parent, r_var, g_var, b_var, a_var, manipulate_image):
super().__init__(parent=parent)
self.pack(fill='x', pady=4)

Expand All @@ -148,89 +121,33 @@ def __init__(self, parent, r_var, g_var, b_var, manipulate_image):

label = ctk.CTkLabel(self, text="R")
label.grid(column=0, row=0, pady=5, sticky='E')
r_entry = ctk.CTkEntry(self, placeholder_text="1.0", textvariable=r_var)
r_entry = ctk.CTkEntry(self, textvariable=r_var)
r_entry.grid(column=1, row=0, pady=5)
r_slider = ctk.CTkSlider(self, from_=RGB_MIN, to=RGB_MAX, width=200, variable=r_var)
r_slider.grid(column=0, row=1, columnspan=2, pady=(0, 10))

label = ctk.CTkLabel(self, text="G")
label.grid(column=0, row=2, pady=5, sticky='E')
g_entry = ctk.CTkEntry(self, placeholder_text="1.0", textvariable=g_var)
g_entry = ctk.CTkEntry(self, textvariable=g_var)
g_entry.grid(column=1, row=2, pady=5)
g_slider = ctk.CTkSlider(self, from_=RGB_MIN, to=RGB_MAX, width=200, variable=g_var)
g_slider.grid(column=0, row=3, columnspan=2, pady=(0, 10))

label = ctk.CTkLabel(self, text="B")
label.grid(column=0, row=4, pady=5, sticky='E')
b_entry = ctk.CTkEntry(self, placeholder_text="1.0", textvariable=b_var)
b_entry = ctk.CTkEntry(self, textvariable=b_var)
b_entry.grid(column=1, row=4, pady=5)
b_slider = ctk.CTkSlider(self, from_=RGB_MIN, to=RGB_MAX, width=200, variable=b_var)
b_slider.grid(column=0, row=5, columnspan=2, pady=(0, 10))

label = ctk.CTkLabel(self, text="A")
label.grid(column=0, row=6, pady=5, sticky='E')
a_entry = ctk.CTkEntry(self, textvariable=a_var)
a_entry.grid(column=1, row=6, pady=5)
a_slider = ctk.CTkSlider(self, from_=ALPHA_MIN, to=ALPHA_MAX, width=200, variable=a_var)
a_slider.grid(column=0, row=7, columnspan=2, pady=(0, 10))

# Create a button to apply color substitution
apply_button = ctk.CTkButton(self, text="Apply color", command=manipulate_image)
apply_button.grid(column=0, row=6, columnspan=2, pady=(0, 10))

# def applyRGB(self, image, r_var, g_var, b_var, channels_var):
# #TODO apply RGB to image

# # print(f'R:{r_var.get()} G:{g_var.get()} B:{b_var.get()} Channel:{channels_var.get()} ')
# # print(image)
# print(type(image))

# def within_range(pixel, r_range, g_range, b_range):
# r, g, b, _ = pixel
# return r_range[0] <= r <= r_range[1] and g_range[0] <= g <= g_range[1] and b_range[0] <= b <= b_range[1]

# def identify_channels(image):
# if image:
# if image.mode == "RGBA":
# return True
# elif image.mode == "RGB":
# return False

# if image:
# r_min_val, r_max_val = 0, 255 #TODO: set this up
# g_min_val, g_max_val = 0, 255
# b_min_val, b_max_val = 0, 255

# # Function to convert a pixel to a new pixel
# def convert_pixel(pixel):
# nonlocal r_min_val, r_max_val, g_min_val, g_max_val, b_min_val, b_max_val
# # print(r_min_val, r_max_val)
# if within_range(pixel, (r_min_val, r_max_val), (g_min_val, g_max_val), (b_min_val, b_max_val)):
# # Add the specified values to the R, G, B, and A channels
# r, g, b, a = pixel
# r += r_var.get()
# g += g_var.get()
# b += b_var.get()
# a += 0 #TODO: set this up

# # Limit the values to be in the range of 0 to 255 and 0.0 to 1.0
# r = max(0, min(255, int(r)))
# g = max(0, min(255, int(g)))
# b = max(0, min(255, int(b)))
# a = max(0, min(255, int(a * 255))) # Scale float alpha to integer range (0-255)


# # Check the choice of channel order
# if channels_var.get() == "RGBA":
# return (r, g, b, a)
# elif channels_var.get() == "RBGA":
# return (r, b, g, a)
# elif channels_var.get() == "BGRA":
# return (b, g, r, a)
# elif channels_var.get() == "BRGA":
# return (b, r, g, a)
# elif channels_var.get() == "GRBA":
# return (g, r, b, a)
# elif channels_var.get() == "GBRA":
# return (g, b, r, a)
# return pixel

# # Apply color substitution to the image
# modified_image = image.convert("RGBA" if identify_channels(image) else "RGB")
# modified_image.putdata(list(map(convert_pixel, image.getdata())))

# # Display the modified image
# # modified_image.save(r'C:\Users\tyler.shoemake\Downloads\test.png')
apply_button.grid(column=0, row=8, columnspan=2, pady=(0, 10))

Loading

0 comments on commit 5496422

Please sign in to comment.