juyam's picture 7113f4b verified
from PIL import Image
import gradio as gr
import tempfile, datetime, os
def 画像保存(canvas画像, 縮尺):
ファイル名 = f"img{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}_{縮尺}%.pdf"
ファイルパス = os.path.join(tempfile.gettempdir(), ファイル名)
canvas画像.convert("RGB").save(ファイルパス, format="PDF")
return ファイルパス
def プレビューと保存用画像(画像, 縮尺):
紙幅, 紙高 = 4961, 3508 # A3サイズ (300dpi)
# 正しく画像をリサイズ
元画像幅, 元画像高 = 画像.size
新画像幅 = 元画像幅 * 縮尺 // 100
新画像高 = 元画像高 * 縮尺 // 100
画像 = 画像.resize((新画像幅, 新画像高))# 縮小後単位画像
while 1:
w,h=画像.size
if 紙幅<=w:
print(f'十分な幅で終了 {w=}')
break
print(f'幅 {w=}')
double=Image.new("RGB", (min(w*2,紙幅), h), "white")
double.paste(画像,(0,0))
double.paste(画像,(w,0))
画像=double
while 1:
w,h=画像.size
if 紙高<=h:
print(f'十分な高さで終了 {h=}')
break
print(f'高さ {h=}')
double=Image.new("RGB", (w, min(h*2,紙高)), "white")
double.paste(画像,(0,0))
double.paste(画像,(0,h))
画像=double
return 画像, 画像 # 一つはプレビュー用、もう一つは保存用に State に保持
with gr.Blocks(css="#preview img {width: 100%;height: auto;}") as iface:
gr.Markdown("# A3タイル画像生成 ver.ymd20250406")
生成結果画像 = gr.State()
入力画像 = gr.Image(type="pil", label="画像をここにアップロード")
プレビュー出力 = gr.Image(label="タイリングされたA3サイズ画像のプレビュー", elem_id="preview")
縮尺スライダー = gr.Slider(minimum=1, maximum=100, step=1, value=10, label="画像の縮尺(1%刻み 1-100 )", interactive=True)
生成ボタン = gr.Button("プレビューの結果を保存用ファイルに確定")
出力ファイル = gr.File(label="保存用A3サイズPDFファイル")
入力画像.change(プレビューと保存用画像, inputs=[入力画像, 縮尺スライダー], outputs=[プレビュー出力, 生成結果画像])
縮尺スライダー.change(プレビューと保存用画像, inputs=[入力画像, 縮尺スライダー], outputs=[プレビュー出力, 生成結果画像])
生成ボタン.click(画像保存, inputs=[生成結果画像, 縮尺スライダー], outputs=出力ファイル)
iface.launch()