Spaces:
Running
Running
import gradio as gr | |
from PIL import Image as PIL_Image # Renaming to avoid conflict with Image from gltflib | |
from io import BytesIO | |
import json | |
import os | |
import glob | |
import src.constants as constants | |
from src.front_card_frame import create_card_frame | |
from src.front_card_image import create_card_image | |
from src.front_card_image_historic_site import create_historic_site_card_image | |
from src.picture_box_model import create_picture_box_model | |
from src.extracted_objects_model import create_extracted_objects_model | |
from src.card_model import create_card_model | |
from src.manhole_model import create_manhole_model | |
language = os.environ.get('LANGUAGE', 'en') | |
print(f'LANGUAGE: {language}') | |
with open(f'src/display_message_{language}.json', 'r', encoding='utf-8') as f: | |
display_message_dict = json.load(f) | |
model_type_dict = display_message_dict['model_type_dict'] | |
color_dict = display_message_dict['color_dict'] | |
default_card_design_image_dict = {value: PIL_Image.open(constants.back_card_img_dict[key]).convert('RGB') for (key, value) in model_type_dict.items()} | |
def update_card_image(card_design_upload, card_design_dropdown, update_type): | |
if update_type == 'Upload': | |
return card_design_upload['background'] | |
else: | |
return default_card_design_image_dict[card_design_dropdown] | |
def create_3dmodel(model_no, title, color, mark, historic_site_type, difficulty, description, is_thick, picture_image, card_design_preview_image): | |
picture_img_bytearray = BytesIO() | |
picture_image['background'].save(picture_img_bytearray, "JPEG", quality=95) | |
picture_img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data. | |
option_dict = { | |
'タイトル': title, | |
'色': color, | |
'マーク': mark, | |
'史跡種類': historic_site_type, | |
'訪問難度': difficulty, | |
'説明文': description, | |
'厚み': '有' if is_thick else '無', | |
'language': language | |
} | |
# Consider implementing model_no categorization rules or creating a factory class | |
if model_no not in ['A', 'B']: | |
# Create the card image (front side) | |
if model_no == '1': | |
front_img_bytearray = create_historic_site_card_image(picture_img_bytearray, option_dict) | |
# Retrieve the card image (back side) | |
back_path = constants.back_card_img_dict[model_no] | |
back_img = PIL_Image.open(back_path) | |
back_img_bytearray = BytesIO() | |
back_img.convert('RGB').save(back_img_bytearray, "JPEG", quality=95) | |
back_img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data | |
else: | |
back_img_bytearray = BytesIO() | |
card_design_preview_image.save(back_img_bytearray, "JPEG", quality=95) | |
back_img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data. | |
card_frame_bytearray = create_card_frame(back_img_bytearray) | |
front_img_bytearray = create_card_image(card_frame_bytearray, picture_img_bytearray, option_dict) | |
# Create a 3D model of the card (return value is the path of the created model) | |
model_path = create_card_model(front_img_bytearray, back_img_bytearray, option_dict) | |
else: | |
# Create a 3D model of the card (return value is the path of the created model) | |
if model_no == 'A': | |
model_path = create_picture_box_model(picture_img_bytearray) | |
if model_no == 'B': | |
model_path = create_extracted_objects_model(picture_img_bytearray) | |
return model_path | |
def create_manhole(image): | |
img_bytearray = BytesIO() | |
image['background'].save(img_bytearray, "JPEG", quality=95) | |
img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data. | |
model_path = create_manhole_model(img_bytearray) | |
return model_path | |
with gr.Blocks() as demo: | |
gr.Markdown(display_message_dict['header']) | |
with gr.Tab(display_message_dict['tab_label_card_general']): | |
with gr.Row(): | |
with gr.Column(): | |
title = gr.Textbox(label=display_message_dict['label_title'], placeholder=display_message_dict['placeholder_title']) | |
gr.Markdown(display_message_dict['card_general_description']) | |
with gr.Row(): | |
with gr.Column(): | |
card_design_dropdown = gr.Dropdown(list(default_card_design_image_dict.keys()), label=display_message_dict['label_card_design_sample']) | |
card_design_upload = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", crop_size="868:1213", label=display_message_dict['label_card_design_upload']) | |
with gr.Column(): | |
card_design_preview_image = gr.Image(label=display_message_dict['label_card_design_preview'], type="pil") | |
card_design_upload.change(fn=lambda card_design_upload, card_design_dropdown: update_card_image(card_design_upload, card_design_dropdown, 'Upload'), | |
inputs=[card_design_upload, card_design_dropdown], outputs=card_design_preview_image) | |
card_design_dropdown.change(fn=lambda card_design_upload, card_design_dropdown: update_card_image(card_design_upload, card_design_dropdown, 'Drop'), | |
inputs=[card_design_upload, card_design_dropdown], outputs=card_design_preview_image) | |
with gr.Column(): | |
description = gr.Textbox(lines=2, label=display_message_dict['label_description'], placeholder=display_message_dict['placeholder_description']) | |
is_thick = gr.Checkbox(label=display_message_dict['label_is_thick'], value=False, info=display_message_dict['info_is_thick']) | |
picture_image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", crop_size="1:1", label=display_message_dict['label_image']) | |
button = gr.Button(display_message_dict['label_button']) | |
button.click( | |
fn=lambda title, description, is_thick, picture_image, card_design_preview_image: | |
create_3dmodel(None, title, None, None, None, None, description, is_thick, picture_image, card_design_preview_image), | |
inputs=[title, description, is_thick, picture_image, card_design_preview_image], | |
outputs=[gr.Model3D(camera_position=(90, 90, 5))] | |
) | |
with gr.Tab(display_message_dict['tab_label_historic_site_card']): | |
with gr.Row(): | |
with gr.Column(): | |
title = gr.Textbox(label=display_message_dict['label_title'], placeholder=display_message_dict['placeholder_title']) | |
color = gr.Radio([(color_dict[key], key) for key in color_dict], value=list(color_dict)[0], label=display_message_dict['label_color']) | |
# Mark(Designation Type) is only visible for Japanese(Because there are no Designation Type Images for other languages). | |
# In other languages, mark is only 'No Designation'(No Designation Type Image). | |
is_mark_visible = True if language == 'ja' else False | |
mark = gr.Radio(display_message_dict['mark_list'], visible=is_mark_visible, | |
value=list(display_message_dict['mark_list'])[len(display_message_dict['mark_list'])-1], label=display_message_dict['label_mark']) | |
historic_site_type = gr.Textbox(label=display_message_dict["label_historic_site_type"], placeholder=display_message_dict["placeholder_historic_site_type"]) | |
with gr.Column(): | |
difficulty = gr.Slider(1, 5, 3, step=1, label=display_message_dict['label_difficulty']) | |
description = gr.Textbox(lines=2, label=display_message_dict['label_description'], placeholder=display_message_dict['placeholder_description']) | |
is_thick = gr.Checkbox(label=display_message_dict['label_is_thick'], value=False, info=display_message_dict['info_is_thick']) | |
picture_image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", crop_size="1:1", label=display_message_dict['label_image']) | |
button = gr.Button(display_message_dict['label_button']) | |
button.click( | |
fn=lambda title, color, mark, historic_site_type, difficulty, description, is_thick, picture_image: | |
create_3dmodel('1', title, color, mark, historic_site_type, difficulty, description, is_thick, picture_image, None), | |
inputs=[title, color, mark, historic_site_type, difficulty, description, is_thick, picture_image], | |
outputs=[gr.Model3D(camera_position=(90, 90, 5))] | |
) | |
gr.Markdown(display_message_dict['footer_historic_site_card']) | |
with gr.Tab(display_message_dict["tab_label_manhole"]): | |
image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", label=display_message_dict['label_image']) | |
button = gr.Button(display_message_dict['label_button']) | |
button.click( | |
create_manhole, | |
inputs=[image], | |
outputs=[gr.Model3D(camera_position=(90, 90, 5))] | |
) | |
demo.launch() |