nekoniii3's picture
new
23a9df6
raw
history blame
3.6 kB
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("%H%M%S") + ".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><strong><h2>Fliptoon用画像作成アプリ</h2></strong></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)