Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -131,7 +131,7 @@ async def nano_banana_completion_api(base_image: Image.Image, prompt: str) -> Im
|
|
| 131 |
|
| 132 |
# --- メイン処理ロジック (Main Processing Logic) ---
|
| 133 |
|
| 134 |
-
async def segment_and_inpaint(original_image_np: np.ndarray,
|
| 135 |
"""
|
| 136 |
アップロードされた一枚絵とブラシで描かれたマスクを受け取り、
|
| 137 |
マスクされた領域を分割し、欠損部分をAI補完する関数。
|
|
@@ -139,13 +139,20 @@ async def segment_and_inpaint(original_image_np: np.ndarray, sketchpad_image_np:
|
|
| 139 |
if original_image_np is None:
|
| 140 |
return None, None, None, "エラー: 元の画像がアップロードされていません。", None
|
| 141 |
|
| 142 |
-
# --- 修正
|
| 143 |
-
if not
|
| 144 |
-
# Sketchpadが空
|
| 145 |
-
return None, None, None, "エラー: 分割したいパーツをブラシで描画してください。描画キャンバスが空
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
|
| 147 |
# PIL Image (元の画像) を取得
|
| 148 |
-
# NOTE: Gradioのデフォルト出力はNumPy配列
|
| 149 |
original_image = Image.fromarray(original_image_np).convert("RGBA")
|
| 150 |
|
| 151 |
# Sketchpadからの入力は、元の画像の上にブラシで描画されたRGBA画像 (描画部分は不透明)
|
|
@@ -159,13 +166,13 @@ async def segment_and_inpaint(original_image_np: np.ndarray, sketchpad_image_np:
|
|
| 159 |
# 配列の次元が4未満(RGBAではない)場合に発生
|
| 160 |
return None, None, None, "エラー: 描画データ形式が不正です。ブラシで描画が行われていないか、Gradioの出力形式に問題があります。", None
|
| 161 |
except Exception as e:
|
| 162 |
-
# その他のスライスエラーなど
|
| 163 |
print(f"Sketchpad処理中の予期せぬエラー: {e}")
|
| 164 |
return None, None, None, "エラー: 描画データの処理中に予期せぬエラーが発生しました。ブラシで適切に描画されているか確認してください。", None
|
| 165 |
|
| 166 |
-
# ユーザーが何も描画しなかった場合のチェック
|
| 167 |
if np.all(sketch_mask_alpha == 0):
|
| 168 |
-
return None, None, None, "エラー: 分割したいパーツをブラシで描画してください。", None
|
| 169 |
|
| 170 |
# NumPy配列からPIL Imageのマスクに変換 (Lモード)
|
| 171 |
hair_mask = Image.fromarray(sketch_mask_alpha, mode='L')
|
|
@@ -272,8 +279,8 @@ with gr.Blocks(theme=theme, title="Live2D素材自動分割・補完アプリ")
|
|
| 272 |
input_sketchpad = gr.Sketchpad(
|
| 273 |
label="② 分割したいパーツをブラシで塗る (例: 前髪)",
|
| 274 |
height=400,
|
| 275 |
-
# Sketchpadにアップロードされた元画像を表示させるためのプレースホルダー
|
| 276 |
brush={"color": "#FF0000", "size": 20}, # ブラシ設定
|
|
|
|
| 277 |
)
|
| 278 |
|
| 279 |
# ★★★ 削除: エラーの原因となっているSketchpadの背景更新ロジックを削除 ★★★
|
|
|
|
| 131 |
|
| 132 |
# --- メイン処理ロジック (Main Processing Logic) ---
|
| 133 |
|
| 134 |
+
async def segment_and_inpaint(original_image_np: np.ndarray, sketchpad_filepath: str, inpaint_prompt: str):
|
| 135 |
"""
|
| 136 |
アップロードされた一枚絵とブラシで描かれたマスクを受け取り、
|
| 137 |
マスクされた領域を分割し、欠損部分をAI補完する関数。
|
|
|
|
| 139 |
if original_image_np is None:
|
| 140 |
return None, None, None, "エラー: 元の画像がアップロードされていません。", None
|
| 141 |
|
| 142 |
+
# --- 修正: Sketchpadの入力がファイルパスの場合の処理 ---
|
| 143 |
+
if not sketchpad_filepath:
|
| 144 |
+
# Sketchpadが空(何も描かれていない)場合はファイルパスがNoneまたは空文字列
|
| 145 |
+
return None, None, None, "エラー: 分割したいパーツをブラシで描画してください。描画キャンバスが空です。", None
|
| 146 |
+
|
| 147 |
+
try:
|
| 148 |
+
# ファイルパスからPIL Imageとして読み込む
|
| 149 |
+
sketchpad_image = Image.open(sketchpad_filepath).convert("RGBA")
|
| 150 |
+
sketchpad_image_np = np.array(sketchpad_image)
|
| 151 |
+
except Exception as e:
|
| 152 |
+
print(f"Sketchpad画像読み込みエラー: {e}")
|
| 153 |
+
return None, None, None, "エラー: 描画キャンバスの画像を読み込めませんでした。ファイルパスが不正です。", None
|
| 154 |
|
| 155 |
# PIL Image (元の画像) を取得
|
|
|
|
| 156 |
original_image = Image.fromarray(original_image_np).convert("RGBA")
|
| 157 |
|
| 158 |
# Sketchpadからの入力は、元の画像の上にブラシで描画されたRGBA画像 (描画部分は不透明)
|
|
|
|
| 166 |
# 配列の次元が4未満(RGBAではない)場合に発生
|
| 167 |
return None, None, None, "エラー: 描画データ形式が不正です。ブラシで描画が行われていないか、Gradioの出力形式に問題があります。", None
|
| 168 |
except Exception as e:
|
| 169 |
+
# その他のスライスエラーなど
|
| 170 |
print(f"Sketchpad処理中の予期せぬエラー: {e}")
|
| 171 |
return None, None, None, "エラー: 描画データの処理中に予期せぬエラーが発生しました。ブラシで適切に描画されているか確認してください。", None
|
| 172 |
|
| 173 |
+
# ユーザーが何も描画しなかった場合のチェック(ファイルパスチェックで大方カバーされるが、念のため)
|
| 174 |
if np.all(sketch_mask_alpha == 0):
|
| 175 |
+
return None, None, None, "エラー: 分割したいパーツをブラシで描画してください。(アルファチャンネルが全てゼロです)", None
|
| 176 |
|
| 177 |
# NumPy配列からPIL Imageのマスクに変換 (Lモード)
|
| 178 |
hair_mask = Image.fromarray(sketch_mask_alpha, mode='L')
|
|
|
|
| 279 |
input_sketchpad = gr.Sketchpad(
|
| 280 |
label="② 分割したいパーツをブラシで塗る (例: 前髪)",
|
| 281 |
height=400,
|
|
|
|
| 282 |
brush={"color": "#FF0000", "size": 20}, # ブラシ設定
|
| 283 |
+
type="filepath" # ★★★ 修正: 出力タイプをファイルパスに変更し、より頑健にする ★★★
|
| 284 |
)
|
| 285 |
|
| 286 |
# ★★★ 削除: エラーの原因となっているSketchpadの背景更新ロジックを削除 ★★★
|