nekoniii3's picture
Update app.py
1a9ef3b
import gradio as gr
import os
import datetime
from zoneinfo import ZoneInfo
import cv2
from PIL import Image, ImageDraw, ImageFilter, ImageColor
def combin_image(input_images, back_color, margin_top, margin_between, margin_side):
dt = datetime.datetime.now(ZoneInfo("Asia/Tokyo"))
# フォルダ・ファイル名設定
work_fol = dt.strftime("%Y%m%d%H%M%S")
combin_file = dt.strftime("%Y%m%d%H%M") + ".jpg"
# フォルダ作成
os.makedirs(work_fol, exist_ok=True)
back_color_rgb = tuple(back_color)
for i, img in enumerate(input_images):
# 対象画像読み込み
load_img = Image.open(img)
img_width, img_height = load_img.size
if i == 0:
# 上下マージン用画像生成
img_margin = Image.new("RGB", (img_width + margin_side * 2, int(margin_between/2) + margin_top), back_color_rgb)
img_margin.save(work_fol + "/" + "img_margin.jpg")
# 画像を生成して貼付
img_add_edge = Image.new("RGB", (img_width + margin_side * 2, img_height + margin_between), back_color_rgb)
img_add_edge.paste(load_img, (margin_side, int(margin_between/2)))
file_name = os.path.basename(img)
print(file_name)
img_add_edge.save(work_fol + "/" + file_name)
im_margin = cv2.imread(work_fol + "/" + "img_margin.jpg")
im_v = im_margin
for i, img in enumerate(input_images):
im = cv2.imread(work_fol + "/" + os.path.basename(img))
im_v = cv2.vconcat([im_v, im])
im_v = cv2.vconcat([im_v, im_margin])
cv2.imwrite(work_fol + "/" + combin_file, im_v)
return work_fol + "/" + combin_file
def get_rgb(color):
if color[0:4] != "rgba":
if color[0] != "#":
color = "#" + color
color_rgb = ImageColor.getrgb(color)
else:
r = round(float(color.split(",")[0].split("(")[1]))
g = round(float(color.split(",")[1]))
b = round(float(color.split(",")[2]))
color_rgb = (r, g, b)
return color_rgb
with gr.Blocks(title="Fliptoon Image Generator", theme=gr.themes.Citrus()) as demo:
title = "<center><h2>Fliptoon用画像作成アプリ</h2></center>"
message = "<center><h3>"
message += "・画像の横幅のサイズは揃えて下さい。<br>"
message += "・画像はファイル名の順番に結合します。ファイル名は01_XXXXXX、02_XXXXXX…などにして下さい。<br>"
message += "</h3></center>"
gr.Markdown(title + message)
gr.Markdown("") # 余白
with gr.Row():
with gr.Column():
files = gr.Files(label="対象画像", file_types=['image'])
back_color = gr.ColorPicker(label="背景色", value="ffffff", interactive=True)
margin_top = gr.Number(label="上下マージン", value=100)
with gr.Row():
margin_between = gr.Number(label="コマ間マージン", value=200)
margin_side = gr.Number(label="コマ左右マージン", value=200)
back_color_rgb = gr.JSON(visible=False)
btn = gr.Button(value="画像作成", variant="primary")
sys_msg = gr.Text(label="システムメッセージ", interactive=False)
with gr.Column():
out_image = gr.Image(label="結合画像", width=320)
btn.click(get_rgb, inputs=[back_color], outputs=[back_color_rgb]).success(
combin_image, inputs=[files, back_color_rgb, margin_top, margin_between, margin_side], outputs=[out_image]
)
demo.queue()
demo.launch(share=False, debug=True)