Spaces:
Running
Running
File size: 3,122 Bytes
1e6a621 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
import gradio as gr
import time
import numpy as np
from PIL import Image
import os
def save_image(im, filename="saved_image.png"):
"""画像をファイルに保存する関数"""
if im is not None and "composite" in im:
# 合成画像(最終結果)を取得
composite = im["composite"]
# numpy配列の場合はPIL Imageに変換
if isinstance(composite, np.ndarray):
composite = Image.fromarray(composite)
# 画像を保存
composite.save(filename)
return f"画像が正常に {filename} として保存されました"
else:
return "保存する画像がないか、無効な画像形式です"
# Gradio Blocksアプリケーションを作成(テーマをOceanに設定)
with gr.Blocks(theme=gr.themes.Ocean()) as demo:
gr.Markdown("# Image Editor Demo")
with gr.Row():
with gr.Column():
# 1:1の縦横比でImageEditorコンポーネントを作成
im = gr.ImageEditor(
type="numpy", # 画像はnumpy配列として処理される
crop_size="1:1", # 正方形のトリミング比率を設定
label="画像エディタ"
)
with gr.Column():
# プレビュー表示用のImageコンポーネントを作成
im_preview = gr.Image(label="プレビュー")
# 各種イベントを追跡するカウンター
with gr.Row():
n_upload = gr.Number(0, label="アップロードイベント数", step=1)
n_change = gr.Number(0, label="変更イベント数", step=1)
n_input = gr.Number(0, label="入力イベント数", step=1)
# ファイル名入力と保存ボタンを追加
with gr.Row():
filename_input = gr.Textbox(value="my_drawing.png", label="ファイル名")
save_btn = gr.Button("画像を保存", variant="primary")
# 保存操作のステータスメッセージ
save_status = gr.Textbox(label="保存ステータス", interactive=False)
# イベントハンドラーを定義:
# 画像がアップロードされたらアップロードカウンターを増加
im.upload(lambda x: x + 1, outputs=n_upload, inputs=n_upload)
# 画像が変更されたら変更カウンターを増加(ユーザー入力または関数更新による)
im.change(lambda x: x + 1, outputs=n_change, inputs=n_change)
# ユーザーが画像を変更したら入力カウンターを増加
im.input(lambda x: x + 1, outputs=n_input, inputs=n_input)
# 画像が変更されたらプレビューエリアに合成画像を表示
im.change(lambda im: im["composite"] if im and "composite" in im else None,
outputs=im_preview,
inputs=im,
show_progress="hidden")
# 保存ボタンクリックイベントを設定
save_btn.click(
fn=save_image,
inputs=[im, filename_input],
outputs=save_status
)
# このスクリプトが直接実行されたときにデモを起動
if __name__ == "__main__":
demo.launch() |