import gradio as gr import numpy as np from PIL import Image, ImageDraw, ImageFont, ImageColor import os import qrcode from datetime import datetime import pytz import paramiko import io import re import random def get_kr_time(): # 한국 시간대 설정 korea_time_zone = pytz.timezone('Asia/Seoul') # 현재 시간을 한국 시간대로 변환 current_time_in_korea = datetime.now(korea_time_zone) # 원하는 형식으로 시간 포맷팅 return current_time_in_korea.strftime("%Y%m%d-%H%M%S") def upload_pil_image_to_sftp(image, remote_image_name): host = "192.168.219.113" port = 22 username = "hj6ch" password = "mine06^^" remote_path = f"/home/hj6ch/outputs/{remote_image_name}" # 이미지를 바이트 스트림으로 변환 img_byte_arr = io.BytesIO() image.save(img_byte_arr, format='PNG') img_byte_arr.seek(0) try: # SFTP 세션 시작 transport = paramiko.Transport((host, port)) transport.connect(username=username, password=password) sftp = paramiko.SFTPClient.from_transport(transport) # 바이트 스트림을 사용하여 파일 업로드 sftp.putfo(img_byte_arr, remote_path) print(f"Image uploaded to {remote_path}") # 연결 종료 sftp.close() transport.close() except Exception as e: print(f"An error occurred: {e}") def create_qr_with_icon(url, icon_path, resolution=(335, 335), border_reduction=2): # Generate QR code with a smaller border qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=4 - border_reduction, # Reduce the border by the border_reduction amount ) qr.add_data(url) qr.make(fit=True) # Create an image from the QR Code instance qr_img = qr.make_image(fill_color="black", back_color="white").convert('RGB') # Resize QR code to the specified resolution # Instead of using Image.ANTIALIAS, you should now use Image.Resampling.LANCZOS qr_img = qr_img.resize(resolution, Image.Resampling.LANCZOS) # Open the icon file icon_img = Image.open(icon_path) # Calculate the maximum size of the icon icon_size = min(resolution) // 4 # Resize the icon, if it's too large icon_img.thumbnail((icon_size, icon_size), Image.Resampling.LANCZOS) # Calculate position for icon (center) icon_pos = ((resolution[0] - icon_img.size[0]) // 2, (resolution[1] - icon_img.size[1]) // 2) # Paste the icon image onto the QR code qr_img.paste(icon_img, icon_pos, icon_img) # Save the QR code with icon return qr_img def gnames(text, r, g, b, font): # 이미지 크기와 글꼴 크기 설정 image_size = (400, 100) # 너비 x 높이 font_size = font # 이미지와 드로잉 객체 생성 image = Image.new('RGBA', image_size, (255, 255, 255, 0)) # 투명한 배경 draw = ImageDraw.Draw(image) # 글꼴 설정 font = ImageFont.truetype("Helvetica_Neue_LT_Std_75_Bold.otf", font_size) text_color = (r, g, b) # 텍스트 그리기 text_bbox = draw.textbbox((0, 0), text, font=font) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] text_x = image_size[0] - text_width # 오른쪽 정렬을 위해 수정 text_y = (image_size[1] - text_height) / 2 draw.text((text_x, text_y), text, fill=text_color, font=font) # 이미지 회전 rotated_image = image.rotate(270, expand=True) return rotated_image from PIL import Image, ImageDraw, ImageFont def shop(text, r, g, b, fs, fonts): # 이미지 크기와 글꼴 크기 설정 image_size = (400, 100) # 너비 x 높이 font_size = fs spacing = 43 # 글자 간 간격 # 이미지와 드로잉 객체 생성 image = Image.new('RGBA', image_size, (255, 255, 255, 0)) # 투명한 배경 draw = ImageDraw.Draw(image) # 글꼴 설정 font = ImageFont.truetype(fonts, font_size) text_color = (r, g, b) # 텍스트 위치 초기화 current_x = 0 text_y = (image_size[1] - font_size) // 2 # 세로 중앙 정렬 # 각 글자를 개별적으로 그리기 for char in text: draw.text((current_x, text_y), char, fill=text_color, font=font) current_x += spacing # 이미지 회전 rotated_image = image.rotate(270, expand=True) return rotated_image def names(text, r, g, b, fs, fonts, rotate, tes): # 이미지 크기와 글꼴 크기 설정 if tes == False: image_size = (400, 100) else: image_size = (800, 136) # 너비 x 높이 font_size = fs # 이미지와 드로잉 객체 생성 image = Image.new('RGBA', image_size, (255, 255, 255, 0)) # 투명한 배경 draw = ImageDraw.Draw(image) # 글꼴 설정 font = ImageFont.truetype(fonts, font_size) text_color = (r, g, b) # 텍스트 크기 계산 text_bbox = draw.textbbox((0, 0), text, font=font) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] # 텍스트를 왼쪽으로 정렬하여 그리기 text_x = 0 # 왼쪽 맞춤 text_y = (image_size[1] - text_height) / 2 draw.text((text_x, text_y), text, fill=text_color, font=font) # 이미지 회전 if rotate: rotated_image = image.rotate(270, expand=True) else: rotated_image = image.rotate(0, expand=True) return rotated_image def create_text_image(text, r, g, b): """ Create an image with the specified text. The text uses two different fonts: normal for letters and outline for numbers. The text color is defined by the RGB values (r, g, b). :param text: The text to be drawn. :param r: Red component of the color, range 0-255. :param g: Green component of the color, range 0-255. :param b: Blue component of the color, range 0-255. :return: An image object with the drawn text. """ # Estimate the width of the image based on the text length estimated_width = sum( [ImageFont.ImageFont.getsize(font=normal_font if char.isalpha() else outline_font, text=char)[0] for char in text]) + 10 * len(text) # Create an image with a transparent background img = Image.new('RGBA', (estimated_width, 100), color=(255, 255, 255, 0)) d = ImageDraw.Draw(img) # Current position for drawing text current_position = 10 # Draw the text with the specified color for char in text: # Select the appropriate font used_font = outline_font if char.isdigit() else normal_font # Draw the character d.text((current_position, 10), char, font=used_font, fill=(r, g, b, 255)) # Calculate width of the character and update position width, _ = ImageFont.ImageFont.getsize(font=used_font, text=char) current_position += width + 5 # Added a small space between characters return img def hex_to_rgb(hex_color): # Remove the '#' character if it exists hex_color = hex_color.lstrip('#') # Convert the hex string to integers r, g, b = tuple(int(hex_color[i:i + 2], 16) for i in (0, 2, 4)) return r, g, b def load_image_as_pil(file_path): """Load an image from the specified file path and return it as a PIL Image object.""" try: with Image.open(file_path) as img: return img.copy() except Exception as e: return str(e) def resize_and_crop_image(image, target_width, target_height): # 이미지를 PIL Image 객체로 변환 img = Image.fromarray(image.astype('uint8'), 'RGB') # 원본 이미지의 크기와 비율 계산 original_width, original_height = img.size ratio = min(original_width / target_width, original_height / target_height) # 새로운 크기 계산 new_width = int(target_width * ratio) new_height = int(target_height * ratio) # 이미지를 중앙에서 자름 img = img.crop(((original_width - new_width) // 2, (original_height - new_height) // 2, (original_width + new_width) // 2, (original_height + new_height) // 2)) # 최종적으로 목표 해상도로 리사이즈 img = img.resize((target_width, target_height), Image.Resampling.LANCZOS) return img def change_color(objekt_color, nn): file_path = nn # Adjust the path according to your setup icon = Image.open(file_path).convert("RGBA") image_np = np.array(icon) _, _, _, alpha = image_np.T mask = alpha > 0 image_np[..., :-1][mask.T] = ImageColor.getcolor(objekt_color, "RGB") colored_icon = Image.fromarray(image_np) return colored_icon def no_change_color(): file_path = 'spe.png' # Adjust the path according to your setup icon = Image.open(file_path).convert("RGBA") image_np = np.array(icon) _, _, _, alpha = image_np.T mask = alpha > 0 colored_icon = Image.fromarray(image_np) return colored_icon # Given: dropdown_name contains either a string number between 1-20 or just a string. # Task: If dropdown_name is a number between 1-20, map it to a corresponding name from a predefined list. # If it's just a string, assign it directly to the variable name. # The list of names namesss = ["SeoYeon", "HyeRin", "JiWoo", "CheaYeon", "YooYeon", "SooMin", "NaKyoung", "YuBin", "DaHyun", "Kotone", "YeonJi", "Nien", "SoHyun", "Xinyu", "Mayu", "JooBin", "HaYeon", "ShiOn"] # Function to process the dropdown_name def process_dropdown(dropdown_name): # Check if dropdown_name is a digit and within the range 1-20 if dropdown_name.isdigit(): number = int(dropdown_name) if 1 <= number <= 20: # Map the number to a name in the list (subtract 1 for zero-based indexing) return namesss[number - 1] # If not a number in 1-20, return the string as it is return dropdown_name # Example usage dropdown_name_example = "5" # Change this to test with different values name = process_dropdown(dropdown_name_example) name ran = 0 def generate(img, obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, ran): # Load and color 'cobj1.png' global objekt_color objekt_color = "" if obj_color == "Atom01": objekt_color = "#ffdd00" if obj_color == "Binary01": objekt_color = "#00ff01" if obj_color == "Cream01": objekt_color = "#ff7477" if obj_color == "Other color": objekt_color = obj_color_picker if obj_color == None: raise gr.Error("Choose objekt color") if txt_color == "Other": txt_color = txt_color_picker elif txt_color == "White": txt_color = "#ffffff" elif txt_color == "Black": txt_color = "#000000" if dropdown_name: name = process_dropdown(dropdown_name) else: name = "" if radio_txt_group_name == "Other": group_name = txt_group_name else: group_name = radio_txt_group_name # Resize and crop the input image resized_image = resize_and_crop_image(img, 1164, 1800) if obj_color == "Special": colored_icon = no_change_color() resized_image.paste(colored_icon, (0, 0), colored_icon) else: if obj_color == "AI image": remove_image_path = f'ai_remove.png' # Adjust the path according to your setup remove_img = Image.open(remove_image_path).convert("RGBA") remove_np = np.array(remove_img) # remove.png에서 r 채널이 255이고 알파 채널이 있는 픽셀 위치 찾기 r_channel = remove_np[:, :, 0] alpha_channel = remove_np[:, :, 3] mask = (r_channel == 255) & (alpha_channel > 0) grimg = Image.open(f'grad2/gradient_{ran}.png') # resized_image를 RGBA 형식으로 변환 (필요한 경우에만) grimg = grimg.convert("RGBA") grimg_np = np.array(grimg) # 해당 위치의 resized_image 픽셀을 투명하게 설정 grimg_np[mask, :] = (0, 0, 0, 0) # RGBA 형식에 맞게 조정 grimg = Image.fromarray(grimg_np) resized_image.paste(grimg, (1038, 0), grimg) else: colored_icon = change_color(objekt_color, 'cobj1.png') resized_image.paste(colored_icon, (0, 0), colored_icon) # Overlay the colored icon on the resized image if txt_color: r, g, b = hex_to_rgb(txt_color) if group_name: if group_name == "ARTMS": colored_icon = change_color(txt_color, 'artms.png') paste_position = (1081, 1371) resized_image.paste(colored_icon, paste_position, colored_icon) else: rotated_image = gnames(str(group_name), r, g, b, 61) paste_position = (1050, 1240) resized_image.paste(rotated_image, paste_position, rotated_image) if not str(name) == "[]": name_rotated_image = names(str(name), r, g, b, 61, "Helvetica_Neue_LT_Std_75_Bold.otf", True, False) name_paste_position = (1050, 161) resized_image.paste(name_rotated_image, name_paste_position, name_rotated_image) else: raise gr.Error("Choose text color") if obj_num: if choose_z_a == "Other": alpa = choose_etc else: if choose_z_a == False: alpa = "" else: alpa = choose_z_a objnum_img = gnames(str(obj_num) + str(alpa), r, g, b, 75) objnum_paste_position = (1050, 452) resized_image.paste(objnum_img, objnum_paste_position, objnum_img) objcount_img = shop("#" + str(obj_count), r, g, b, 75, "MatrixSSK Regular.ttf") objcount_paste_position = (1046, 871) resized_image.paste(objcount_img, objcount_paste_position, objcount_img) if chk: remove_image_path = 'remove.png' # Adjust the path according to your setup remove_img = Image.open(remove_image_path).convert("RGBA") remove_np = np.array(remove_img) # remove.png에서 r 채널이 255이고 알파 채널이 있는 픽셀 위치 찾기 r_channel = remove_np[:, :, 0] alpha_channel = remove_np[:, :, 3] mask = (r_channel == 255) & (alpha_channel > 0) # resized_image를 RGBA 형식으로 변환 (필요한 경우에만) resized_image = resized_image.convert("RGBA") resized_np = np.array(resized_image) # 해당 위치의 resized_image 픽셀을 투명하게 설정 resized_np[mask, :] = (0, 0, 0, 0) # RGBA 형식에 맞게 조정 resized_image = Image.fromarray(resized_np) print() print() print("Front Render") print(f"Objekt color is {objekt_color}") print(f"Name is {name}") print(f"Objekt number is {obj_num}") print(f"Group name is {group_name}") print(f"Round is {chk}") krtime = get_kr_time() output_filename = f'{name}_{group_name}_{krtime}_front.png' print(ran) return resized_image def assign_url(qr_url): # 각 문자열에 대응하는 URL 매핑 url_mapping = { "tripleS website": "https://triplescosmos.com/", "tripleS youtube": "https://youtube.com/@triplescosmos", "tripleS 𝕏": "https://x.com/triplescosmos", "tripleS discord": "https://discord.gg/triplescosmos" } # qr_url이 매핑된 문자열 중 하나라면 해당 URL을, 아니라면 qr_url 그대로를 반환 return url_mapping.get(qr_url, qr_url) def generate_back(img, obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, radio_class, txt_class, obj_color_outline, obj_color_outline_picker, radio_season, txt_season, cr, btn_logo, qr_url, ran): # Load and color 'cobj1.png' global objekt_color if obj_color == "Atom01": objekt_color = "#ffdd00" if obj_color == "Binary01": objekt_color = "#00ff01" if obj_color == "Cream01": objekt_color = "#ff7477" if obj_color == "Special": objekt_color = "Special" if obj_color == "Other color": objekt_color = obj_color_picker if obj_color == None: raise gr.Error("Choose objekt color") if obj_color_outline == "White": objekt_color_outline = "#ffffff" if obj_color_outline == "Black": objekt_color_outline = "#000000" if obj_color_outline == "Other": objekt_color_outline = obj_color_outline_picker if txt_color == "Other": txt_color = txt_color_picker elif txt_color == "White": txt_color = "#ffffff" elif txt_color == "Black": txt_color = "#000000" if dropdown_name: name = process_dropdown(dropdown_name) else: name = "" if radio_txt_group_name == "Other": group_name = txt_group_name else: group_name = radio_txt_group_name if radio_class == "Other": classes = txt_class else: classes = radio_class if radio_season == "Other": season = txt_season else: season = radio_season # Resize and crop the input image resized_image = load_image_as_pil('all.png') if obj_color == "Special": resized_image = Image.open('special_back.png') else: if obj_color == "AI image": file_path = f'grad2/gradient_{ran}.png' # 이미지 열기 img = Image.open(file_path) width, height = img.size # 잘라낼 부분 설정 (x < 126에 해당하는 부분) left = 125 top = 0 right = 1289 # x가 126보다 작은 부분까지 bottom = height # 이미지 자르기 cropped_img = img.crop((left, top, right, bottom)) resized_image = cropped_img else: colored_icon = change_color(objekt_color, 'all.png') resized_image.paste(colored_icon, (0, 0), colored_icon) colored_icon = change_color(objekt_color_outline, 'outline.png') resized_image.paste(colored_icon, (0, 0), colored_icon) colored_icon = change_color(txt_color, 'back_ui.png') resized_image.paste(colored_icon, (0, 0), colored_icon) # Overlay the colored icon on the resized image if txt_color: r, g, b = hex_to_rgb(txt_color) if group_name: if group_name == "ARTMS": colored_icon = change_color(txt_color, 'artms.png') paste_position = (974, 1371) resized_image.paste(colored_icon, paste_position, colored_icon) else: rotated_image = gnames(str(group_name), r, g, b, 61) paste_position = (943, 1238) resized_image.paste(rotated_image, paste_position, rotated_image) if not str(name) == "[]": name_rotated_image = names(str(name), r, g, b, 130, "Helvetica_Neue_LT_Std_65_Medium.otf", False, True) name_paste_position = (54, 466) resized_image.paste(name_rotated_image, name_paste_position, name_rotated_image) name_rotated_image = names(str(name), r, g, b, 61, "Helvetica_Neue_LT_Std_75_Bold.otf", True, False) name_paste_position = (932, 159) resized_image.paste(name_rotated_image, name_paste_position, name_rotated_image) if not radio_class == None: name_rotated_image = names(str(classes), r, g, b, 130, "Helvetica_Neue_LT_Std_65_Medium.otf", False, True) name_paste_position = (54, 700) resized_image.paste(name_rotated_image, name_paste_position, name_rotated_image) if not season == None: # name_rotated_image = seas(str(season), r, g, b, 130, ["Helvetica_Neue_LT_Std_65_Medium.otf", "Helvetica_Neue_LT_Std_75_Bold_Outline.otf"], False, True) name_rotated_image = names(str(season), r, g, b, 130, "Helvetica_Neue_LT_Std_65_Medium.otf", False, True) # name_rotated_image = create_text_image(str(season), r,g,b) name_paste_position = (56, 939) resized_image.paste(name_rotated_image, name_paste_position, name_rotated_image) else: raise gr.Error("Choose text color") if obj_num: if choose_z_a == "Other": alpa = choose_etc else: if choose_z_a == False: alpa = "" else: alpa = choose_z_a objnum_img = gnames(str(obj_num) + str(alpa), r, g, b, 75) objnum_paste_position = (951, 448) resized_image.paste(objnum_img, objnum_paste_position, objnum_img) objcount_img = shop("#" + str(obj_count), r, g, b, 75, "MatrixSSK Regular.ttf") objcount_paste_position = (943, 867) resized_image.paste(objcount_img, objcount_paste_position, objcount_img) if btn_logo: colored_icon = change_color(txt_color, 'logo.png') resized_image.paste(colored_icon, (61, 162), colored_icon) if qr_url: url_txt = assign_url(qr_url) colored_icon = create_qr_with_icon(url_txt, 'qr_icon.png') # Ensure 'colored_icon' is in RGBA mode so that it has an alpha channel for transparency. if colored_icon.mode != 'RGBA': colored_icon = colored_icon.convert('RGBA') # When pasting, the third argument is the mask, which should be just the alpha channel of 'colored_icon'. # This assumes that 'colored_icon' is the image you want to paste, and its alpha channel is the mask. resized_image.paste(colored_icon, (555, 1098), colored_icon.split()[3]) if cr: colored_icon = change_color(txt_color, 'cr.png') resized_image.paste(colored_icon, (0, 0), colored_icon) if chk: remove_image_path = 'remove.png' # Adjust the path according to your setup remove_img = Image.open(remove_image_path).convert("RGBA") remove_np = np.array(remove_img) # remove.png에서 r 채널이 255이고 알파 채널이 있는 픽셀 위치 찾기 r_channel = remove_np[:, :, 0] alpha_channel = remove_np[:, :, 3] mask = (r_channel == 255) & (alpha_channel > 0) # resized_image를 RGBA 형식으로 변환 (필요한 경우에만) resized_image = resized_image.convert("RGBA") resized_np = np.array(resized_image) # 해당 위치의 resized_image 픽셀을 투명하게 설정 resized_np[mask, :] = (0, 0, 0, 0) # RGBA 형식에 맞게 조정 resized_image = Image.fromarray(resized_np) print() print() print("back Render") print(f"Objekt color is {obj_color}") print(f"Objekt outline color is {objekt_color_outline}") print(f"Name is {name}") print(f"CLASS is {classes}") print(f"SEASON is {season}") print(f"Objekt number is {obj_num}") print(f"Group name is {group_name}") print(f"Round is {chk}") krtime = get_kr_time() output_filename = f'{name}_{group_name}_{krtime}_back.png' print(ran) return resized_image def change_ran(a): if a == "AI image": ran = random.randrange(1, 64) return ran else: return 0 def update_obj_color_picker_visibility(obj_color): if obj_color == "Other color": return gr.ColorPicker(visible=True), gr.Slider(1, 64, 0, label="AI id", visible=False), gr.Button(visible=False) elif obj_color == "AI image": ran = random.randrange(1, 64) return gr.ColorPicker(visible=False), gr.Slider(1, 64, ran, label="AI id", visible=True), gr.Button(visible=True) else: return gr.ColorPicker(visible=False), gr.Slider(1, 64, 0, label="AI id", visible=False), gr.Button(visible=False) def update_obj_color_class_visibility(obj_color2): if "01" in obj_color2: return gr.ColorPicker(visible=True) else: return gr.ColorPicker(visible=False) # The rest of your code remains the same def update_obj_color_img_visibility(obj_color_img): if obj_color_img == "Other image": return gr.Image(visible=True) else: return gr.Image(visible=False) def update_txt_color_picker_visibility(txt_color_picker): if txt_color_picker == "Other": return gr.Image(visible=True) else: return gr.Image(visible=False) def update_txt_name_visibility(dropdown_group_name): if dropdown_group_name == "Other": return gr.Textbox(visible=True, interactive=True) else: return gr.Textbox(visible=False) def update_txt_group_name_visibility(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) def update_alpa_visibiliy(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) def update_chk_num(a): if a == True: return gr.Textbox(visible=True), gr.Radio(visible=True), gr.Textbox(visible=True) else: return gr.Textbox(visible=False), gr.Radio(visible=False), gr.Textbox(visible=False) def clear(a): return gr.Radio(value=None), gr.ColorPicker(value=None), gr.Image(value=None), gr.Radio(value=None), gr.ColorPicker( value="#ffffff"), gr.Dropdown(value=""), gr.Textbox(value=None), gr.Radio(value=None), gr.Textbox( value=None), gr.Checkbox(value=True), gr.Textbox(value=None), gr.Radio(value=None), gr.Textbox( value=None), gr.Textbox(value=None), gr.Checkbox(value=None) def flip_back(a): return gr.Row(visible=False), gr.Row(visible=True), gr.Button(visible=False), gr.Button(visible=True), gr.Image def flip_front(a): return gr.Row(visible=True), gr.Row(visible=False), gr.Button(visible=True), gr.Button(visible=False) def txt_class_visibility(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) def chk_sync(a): return gr.Checkbox(value=a) def obj_color_outline_picker_visibility(a): if a == "Other": return gr.ColorPicker(visible=True) else: return gr.ColorPicker(visible=False) def txt_season_visibility(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) with gr.Blocks(theme=gr.themes.Soft()) as demo: with gr.Row(): gr.Markdown( """ # Custom Objekt ## Input image and Select Options """) f_btn_back = gr.Button(value="Flip", scale=1, visible=True) f_btn_front = gr.Button(value="Flip", scale=1, visible=False) with gr.Row(visible=True) as al1: img = gr.Image(label="Image") with gr.Column(): with gr.Group(): obj_color = gr.Radio(["Atom01", "Binary01", "Cream01", "Special", "Other color", "AI image"], label="Objekt Color", value="Cream01") with gr.Row(): ai_num = gr.Slider(1, 64, 10, label="AI id", visible=False,step=1) change_ai = gr.Button(value="Change AI", visible=False) obj_color_picker = gr.ColorPicker(label="Other Objekt Color", visible=False, interactive=True) obj_color_img = gr.Image(label="Image", visible=False, interactive=True) obj_color.change(update_obj_color_img_visibility, obj_color, obj_color_img) with gr.Group(): txt_color = gr.Radio(["White", "Black", "Other"], label="Text Color", value="Black") txt_color_picker = gr.ColorPicker(label="Other Text Color", value="#ffffff", visible=False, interactive=True) txt_color.change(update_txt_color_picker_visibility, txt_color, txt_color_picker) with gr.Group(): dropdown_name = gr.Dropdown( ["SeoYeon", "HyeRin", "JiWoo", "ChaeYeon", "YooYeon", "SooMin", "NaKyoung", "YuBin", "Kaede", "DaHyun", "Kotone", "YeonJi", "Nien", "SoHyun", "Xinyu", "Mayu", "Lynn", "JooBin", "HaYeon", "ShiOn"], label="Name", allow_custom_value=True) txt_name = gr.Textbox(label="Name", placeholder="RinHye", visible=False, interactive=True) dropdown_name.change(update_txt_name_visibility, dropdown_name, txt_name) radio_txt_group_name = gr.Radio(["tripleS", "ARTMS", "Other"], label="Group name") txt_group_name = gr.Textbox(label="Other Group name", placeholder="CLASSY", visible=False, interactive=True) radio_txt_group_name.change(update_txt_group_name_visibility, radio_txt_group_name, txt_group_name) with gr.Group(): with gr.Row(): obj_num = gr.Textbox(label="Objekt number", placeholder="100", interactive=True, visible=False) choose_z_a = gr.Radio(["Z", "A", "Other"], label="Z or A", interactive=True, visible=False) choose_etc = gr.Textbox(label="Alphabet", placeholder="S", interactive=True, visible=False) obj_count = gr.Textbox(label="Objekt Serial", placeholder="00001", interactive=True, visible=False) choose_z_a.change(update_alpa_visibiliy, choose_z_a, choose_etc) chk_num = gr.Checkbox(label="Add Objekt numbers") chk_num.change(update_chk_num, chk_num, [obj_num, choose_z_a, obj_count]) with gr.Group(): chk = gr.Checkbox(label="Rounded", value=True, interactive=True) with gr.Group(): btn = gr.Button(value="Generate") with gr.Column(): outputs = gr.Image(label="Edited Image", scale=10) btn_clear = gr.ClearButton(value="Clear") with gr.Row(visible=False) as al2: preview = gr.Image(label="Image") with gr.Column(): with gr.Group(): obj_color_outline = gr.Radio(["White", "Black", "Other"], label="Out line", value="White") obj_color_outline_picker = gr.ColorPicker(label="Other Outline Color", value="#ffffff", visible=False, interactive=True) with gr.Group(): btn_logo = gr.Checkbox(label="Add Logo", interactive=True) with gr.Group(): radio_class = gr.Radio(["Zero", "First", "Double", "Special", "Other"], label="CLASS", visible=True) txt_class = gr.Textbox(label="Other class", placeholder="Third", visible=False) with gr.Group(): radio_season = gr.Radio(["Atom01", "Binary01", "Cream01", "Other"], label="SEASON") txt_season = gr.Textbox(label="Other SEASON", interactive=True, visible=False) with gr.Group(): qr_url = gr.Dropdown(["tripleS website", "tripleS youtube", "tripleS 𝕏", "tripleS discord"], label="qr url", info="Can write any url", allow_custom_value=True) with gr.Row(): qr_option1 = gr.Checkbox(label="tripleS logo", value=False, interactive=True) qr_option2 = gr.Checkbox(label="ARTMS (Cosmo) logo", value=False, interactive=True) with gr.Group(): cr = gr.Checkbox(label="Add Rights", value=False, interactive=True) with gr.Group(): chk2 = gr.Checkbox(label="Rounded", value=True, interactive=True) with gr.Group(): btn_back = gr.Button(value="Generate") with gr.Column(): outputs2 = gr.Image(label="Edited Image", scale=10) btn_clear2 = gr.ClearButton(value="Clear") obj_color.change(update_obj_color_picker_visibility, obj_color, [obj_color_picker, ai_num, change_ai]) radio_season.change(txt_season_visibility, radio_season, txt_season) obj_color_outline.change(obj_color_outline_picker_visibility, obj_color_outline, obj_color_outline_picker) chk.change(chk_sync, chk, chk2) chk2.change(chk_sync, chk2, chk) btn_clear.click(clear, btn_clear, [obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, chk_num]) btn_clear2.click(clear, btn_clear2, [obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, chk_num]) change_ai.click(change_ran, obj_color, ai_num) btn.click(generate, [img, obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, ai_num], outputs) btn_back.click(generate_back, [img, obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, radio_class, txt_class, obj_color_outline, obj_color_outline_picker, radio_season, txt_season, cr, btn_logo, qr_url, ai_num], outputs2) radio_class.change(txt_class_visibility, radio_class, txt_class) f_btn_back.click(flip_back, f_btn_back, [al1, al2, f_btn_back, f_btn_front]) f_btn_back.click(generate_back, [img, obj_color, obj_color_picker, obj_color_img, txt_color, txt_color_picker, dropdown_name, txt_name, radio_txt_group_name, txt_group_name, chk, obj_num, choose_z_a, choose_etc, obj_count, radio_class, txt_class, obj_color_outline, obj_color_outline_picker, radio_season, txt_season, cr, btn_logo, qr_url, ai_num], preview) f_btn_front.click(flip_front, f_btn_back, [al1, al2, f_btn_back, f_btn_front]) if __name__ == "__main__": demo.launch()