from PIL import Image, ImageOps, PngImagePlugin import random as rn import gradio as gr from datetime import datetime import pytz #from interface import all_components from text_assist import * season_color = {'Atom01': '#FFDD00', 'Binary01': '#00FF00', 'Cream01': '#FF7477', 'Divine01': '#B301FE','Ever01': '#33ecfd'} #all_components = [common_name, common_group, quick_season, balanced_season, balanced_class, balanced_number, balanced_line, balanced_serial] mask = Image.open('front_resource/mask.png') import os # 폴더 경로 지정 folder_path = "./data/cache" # 폴더 생성 (존재하지 않는 경우) os.makedirs(folder_path, exist_ok=True) def image_uploaded(image_path): image = Image.open(image_path) try: image = ImageOps.exif_transpose(image) #https://github.com/python-pillow/Pillow/issues/4703 except ZeroDivisionError: image = image.rotate(270, expand=True) #There is an issue with vertically taken photos in the Kiwi Browser on Android, so I manually rotate them. base = Image.new('RGBA', mask.size, (0, 0, 0, 0)) if not image.size == mask.size: blank_image = Image.new('RGBA', mask.size, (0, 0, 0, 0)) x_pos = 0 y_pos = 0 r = mask.size[0]/image.size[0] y_r = image.size[1] * r x_r = image.size[0] * r if y_r > mask.size[1]: y_pos = (mask.size[1]-y_r)//2 image = image.resize((int(x_r), int(y_r)), Image.Resampling.LANCZOS) elif y_r < mask.size[1]: r = mask.size[1]/image.size[1] y_r = image.size[1] * r x_r = image.size[0] * r x_pos = (mask.size[0]-x_r)//2 image = image.resize((int(x_r), int(y_r)), Image.Resampling.LANCZOS) elif y_r == mask.size[1]: image = image.resize(mask.size, Image.Resampling.LANCZOS) x_pos = 0 y_pos = 0 blank_image.paste(image, (int(x_pos), int(y_pos))) base.paste(blank_image, (0,0), mask) else: base.paste(image, (0,0), mask) return base if __name__ == '__main__': image = Image.new('RGBA', (200,100), (255,255,255,255)) image_uploaded(image).show() def front(mode: str , image: Image, *args): if not image: # Remove black screen # image = Image.new(size=(1083, 1673), mode='RGBA', color=(0,0,0,255)) return None, None else: image.convert('RGBA') color = [(255, 255, 255), (0, 0, 0)] number = '100' line = 'Z' serial = '0' if mode == 'quick': color = (season_color[args[2]], (0,0,0)) number = f"{rn.randint(101, 108)}" line = 'Z' serial = rn. randint(1, 1800) if mode == 'balanced': match args[4]: case 'First': color = (season_color[args[3]], (0,0,0)) case 'Welcome': color = ((255,255,255), (0,0,0)) case 'Special': color = ('Special', (0,0,0)) case 'Premier': color = ('#2E3192', (255,255,255)) case 'OMA1': color = ('OMA1', (255,255,255)) case 'OMA2': color = ('OMA2', (255,255,255)) number = (str(args[5]) if args[5] else None) line = args[6] if args[6] else '' serial = args[7] if args[7] else None if mode == 'expert': print(args[9], args[12]) match args[8]: case 'Static': color = (colorPicker2rgb(str(args[9])), colorPicker2rgb(str(args[12]))) case 'Gradient': pass case 'Image': pass image = generate_front(image, color, args[0], args[1], number, line, serial) meta = PngImagePlugin.PngInfo() meta.add_text('objektify', 'V3') krtime = get_kr_time() image.save(f'{folder_path}/objektify-{krtime}.png', pnginfo=meta) # save to cache return image, f'{folder_path}/objektify-{krtime}.png' def colorPicker2rgb(value: str): if value.startswith('rgba'): # "rgba(10,20,20,1)" 형식에서 숫자만 추출 rgba_values = value.strip("rgba()").split(",") # RGB 값을 부동소수점에서 정수로 변환 rgb_tuple = tuple(map(lambda x: round(float(x)), rgba_values[:3])) return rgb_tuple elif value.startswith('#'): return hex2rgb(value) 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") side_mask = Image.open('front_resource/side.png') def generate_front(image, color: list, name, group, number, line, serial): #color = (main_color, text_color) if not isinstance(color[0], tuple) and not color[0].startswith('#'): side_bar = Image.open(f'front_resource/{color[0]}.png') else: side_bar = Image.new('RGBA', side_mask.size, color[0]) draw = ImageDraw.Draw(side_bar) if name: text_draw_default(draw, (51, 35), "Helvetica_Neue_LT_Std_75_Bold.otf", 60, name, color[1]) if group: text_draw_right(draw, (1428, 35), "Helvetica_Neue_LT_Std_75_Bold.otf", 60, group, color[1]) if number and serial: text_draw_right(draw, (688+30, 35), "Helvetica_Neue_LT_Std_75_Bold.otf", 68, str(number)+line,color[1]) text_draw_default(draw, (706+30, 30), "MatrixSSK_custom.ttf", 68, '#'+str(serial).zfill(5),color[1]) if number and not serial: text_draw_center(draw, (side_mask.size[0]//2 + 7, side_mask.size[1]//2), "Helvetica_Neue_LT_Std_75_Bold.otf", 68, str(number)+line,color[1]) if serial and not number: text_draw_center(draw, (side_mask.size[0]//2, side_mask.size[1]//2 -5), "MatrixSSK_custom.ttf", 68, '#'+str(serial).zfill(5),color[1]) if isinstance(color[0], str) and color[0].startswith('OMA'): additional_bar = Image.open(f'front_resource/{color[0]}_add.png') image.paste(additional_bar, (944, 77), additional_bar) image.paste(side_bar.rotate(270, expand=True), (965, 98), side_mask.rotate(270, expand=True)) print('generated!') return image