Spaces:
Sleeping
Sleeping
| 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() |