import pickle import gradio as gr import random import shutil from PIL.ImageOps import expand import re import fn import edimg import os from PIL import Image, ImageDraw, ImageFont, ImageColor, ImageFilter, ImageSequence, PngImagePlugin import pandas as pd import pre def change_img_type(a): if a == "Image": return gr.File(visible=True), gr.Image(visible=False), gr.Image(visible=False) else: return gr.File(visible=False), gr.Image(visible=True), gr.Image(visible=True) def gif2cache(a): krtime = fn.get_kr_time() shutil.copy2(a, f'/data/cache/original_{krtime}.gif') return a def gif_clear(): return def img2cache_resize(a, dummy): a = Image.open(a).convert('RGB') x, y = a.size krtime = fn.get_kr_time() a.save(f'/data/cache/original_{krtime}.jpg', quality=90) if x <= y: a = edimg.resize_img(a, 1164, 1800) return a, dummy else: return a, not dummy def rotate(a): if a == None: return None a = Image.open(a) a = a.rotate(270, expand=True) print('rotated') a = edimg.resize_img(a, 1164, 1800) return a def obj_color_update(obj_color): if obj_color == "Other color": return gr.ColorPicker(visible=True), gr.ColorPicker(visible=True), gr.Slider(1, 1000, 0, visible=False), gr.Button(visible=False) elif obj_color == "AI Color": ran = random.randrange(1, 1000) return gr.ColorPicker(visible=False), gr.ColorPicker(visible=False), gr.Slider(1, 1000, ran, visible=True), gr.Button(visible=True) else: return gr.ColorPicker(visible=False), gr.ColorPicker(visible=False), gr.Slider(1, 1000, 0, visible=False), gr.Button(visible=False) def txt_color_update(txt_color_picker): if txt_color_picker == "Other": return gr.Image(visible=True), gr.Image(visible=True) else: return gr.Image(visible=False), gr.Image(visible=False) def txt_color_hex_update(txt): try: hex_digits = match_hex(txt) print("올바른 16진수 문자열입니다.") return hex_digits, hex_digits except ValueError: print("16진수 문자열이 아닙니다.") return "#ffffff", "#ffffff" def match_hex(hex_str): # 정규표현식: #이 선택적으로 있고, 3자리 또는 6자리의 16진수 pattern = r'^#?([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6})$' match = re.match(pattern, hex_str) if not match: raise ValueError("유효하지 않은 hex 형식입니다.") hex_digits = match.group(1) # 3자리 hex인 경우 각 문자를 두번씩 반복하여 6자리로 확장 if len(hex_digits) == 3: hex_digits = ''.join([ch * 2 for ch in hex_digits]) return "#"+hex_digits def group_member_name_update(a, artist_name, displayed_name): if a == "Other": return gr.Textbox(visible=True), gr.Dropdown([], label="Member Name", allow_custom_value=True) elif a == "tripleS": return gr.Textbox(visible=False), gr.Dropdown( ["SeoYeon", "HyeRin", "JiWoo", "ChaeYeon", "YooYeon", "SooMin", "NaKyoung", "YuBin", "Kaede", "DaHyun", "Kotone", "YeonJi", "Nien", "SoHyun", "Xinyu", "Mayu", "Lynn", "JooBin", "HaYeon", "ShiOn", "ChaeWon", "Sullin", "SeoAh", "JiYeon"], label="Member Name", allow_custom_value=True) elif a == "ARTMS": return gr.Textbox(visible=False), gr.Dropdown(["HeeJin", "JinSoul", "Kim Lip", "Choerry", "HaSeul"], label="Member Name", allow_custom_value=True) else: path = '/data/presets/' data = pd.read_pickle(path+displayed_name+'/data.pkl') group_name = data['group'] artist_name = data['artist'] member_name_dropdown = gr.Dropdown(choices=artist_name, label="Member Name", allow_custom_value=True, value=artist_name[0]) return gr.Textbox(visible=False), member_name_dropdown def alphabet_txt_update(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) def serial_random(): random_number = random.randint(0, 99999) formatted_number = f"{random_number:05}" return gr.Textbox(value=formatted_number) def frame_color_update(a): if a == "Other": return gr.ColorPicker(visible=True), gr.ColorPicker(visible=True) else: return gr.ColorPicker(visible=False), gr.ColorPicker(visible=True) def ex_gen_count(a): if a == "Two Files": return gr.Image(visible=True) else: return gr.Image(visible=False) def rounded_sync(a): return gr.Checkbox(value=a) def ex_blur(a): if a: return gr.Slider(interactive=True) else: return gr.Slider(interactive=False) def refresh(): directory_path = "/data" # directory_path 내의 항목들을 리스트로 가져옴 items = os.listdir(directory_path) # 해당 항목이 디렉토리인지 확인 후, 특정 폴더를 제외한 폴더 이름만 필터링 folders = [item for item in items] folders_tuple = tuple(folders) # 현재 작업 디렉토리의 폴더 이름들을 튜플로 반환 (특정 폴더 제외) return folders_tuple def refresh2(): directory_path = "./caa" # directory_path 내의 항목들을 리스트로 가져옴 items = os.listdir(directory_path) # 해당 항목이 디렉토리인지 확인 후, 특정 폴더를 제외한 폴더 이름만 필터링 folders = [item for item in items] folders_tuple = tuple(folders) # 현재 작업 디렉토리의 폴더 이름들을 튜플로 반환 (특정 폴더 제외) return folders_tuple def dev(): folders = refresh() return "Do", gr.Dropdown(folders, visible=True, interactive=True) def dev2222(): folders = refresh2() return "Do", gr.Dropdown(folders, visible=True, interactive=True) def dev2(): time = fn.get_kr_time() os.rename("/data/cache", f"/data/{time}") os.mkdir("/data/cache") return "Moved" def dev3(a): fn.zip(a) return f"/data/{a}" def dev4(a): return f"/data/{a}" def dev42222(a): return f"./caa/{a}" def dev5(a): fn.remove(a) return "Deleted" def txt_season_visibility(a): if a == "Other": return gr.Textbox(visible=True), gr.Textbox(visible=True) else: return gr.Textbox(visible=False), gr.Textbox(visible=False) def change_ran(a): if a == "AI Color": ran = random.randrange(1, 1000) return ran else: return 0 def txt_class_visibility(a): if a == "Other": return gr.Textbox(visible=True) else: return gr.Textbox(visible=False) def custom_name(count): visibilities = [True] * len(count) + [False] * (12 - len(count)) return ( gr.Image(label=count[0] if len(count) > 0 else 'Sign', visible=visibilities[0]), gr.Image(label=count[1] if len(count) > 1 else 'Sign', visible=visibilities[1]), gr.Image(label=count[2] if len(count) > 2 else 'Sign', visible=visibilities[2]), gr.Image(label=count[3] if len(count) > 3 else 'Sign', visible=visibilities[3]), gr.Image(label=count[4] if len(count) > 4 else 'Sign', visible=visibilities[4]), gr.Image(label=count[5] if len(count) > 5 else 'Sign', visible=visibilities[5]), gr.Image(label=count[6] if len(count) > 6 else 'Sign', visible=visibilities[6]), gr.Image(label=count[7] if len(count) > 7 else 'Sign', visible=visibilities[7]), gr.Image(label=count[8] if len(count) > 8 else 'Sign', visible=visibilities[8]), gr.Image(label=count[9] if len(count) > 9 else 'Sign', visible=visibilities[9]), gr.Image(label=count[10] if len(count) > 10 else 'Sign', visible=visibilities[10]), gr.Image(label=count[11] if len(count) > 11 else 'Sign', visible=visibilities[11]) ) import cairosvg def side_group_img_upload(img): if isinstance(img, str): cairosvg.svg2png(url=img, write_to=f"temp.png") img = Image.open(f"temp.png") size = img.size r = 90/size[1] print((int(size[0]*r), int(size[1]*r))) img = img.resize((int(size[0]*r), int(size[1]*r)), Image.Resampling.LANCZOS) img = img.rotate(270, expand=True) return img #outputs=[preset_name, artist_name, group_name, company_name, top_logo_img, side_group_img, qr_logo_img, sign_img1, sign_im def load_preset(preset): file_path = f"/data/presets/{preset}/" data = pd.read_pickle(file_path+'data.pkl') top_logo_img = Image.open(file_path+'top_logo.png') if os.path.isfile(file_path+'sideNameImage.png'): side_group_img = Image.open(file_path+'sideNameImage.png') else: side_group_img = None qr_logo_img = Image.open(file_path+'qr_logo.png') # 초기화 sign_imgs = [None] * 12 # 이미지 로드 for i in range(len(data['artist'])): if i < 12: sign_imgs[i] = Image.open(f"{file_path}{data['artist'][i]}.png") # 개별 변수로 사용하고 싶다면 sign_img1, sign_img2, sign_img3, sign_img4, sign_img5, sign_img6, \ sign_img7, sign_img8, sign_img9, sign_img10, sign_img11, sign_img12 = sign_imgs return data['preset_name'], data['artist'], data['group'], data['company'], top_logo_img, side_group_img, qr_logo_img, sign_img1, sign_img2, sign_img3, sign_img4, sign_img5, sign_img6, sign_img7, sign_img8, sign_img9, sign_img10, sign_img11, sign_img12