import numpy as np import gradio as gr import qrcode from PIL import Image import io # Added for parity with user-provided snippet (currently unused) def reverse_text(text): """ テキストを反転する。 Args: text (str): 反転したいテキスト。 Returns: str: 反転されたテキスト。 """ return text[::-1] def generate_qr_code(text): """ テキストからQRコードを生成する。 Args: text (str): QRコードに埋め込むテキスト。 Returns: numpy.ndarray: 生成されたQRコード画像 (RGB)。 """ qr = qrcode.QRCode(version=5, box_size=10, border=5) qr.add_data(text) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") # PILイメージをNumPy配列に変換 img_array = np.array(img.convert("RGB")) return img_array def count_words(text): """ テキストの単語数をカウントする。 Args: text (str): カウントしたいテキスト。 Returns: int: 単語数。 """ if not text.strip(): return 0 return len(text.split()) def resize_image(image, width, height): """ 画像をリサイズする。 Args: image (numpy.ndarray): リサイズしたい画像。 width (int): 新しい幅。 height (int): 新しい高さ。 Returns: numpy.ndarray: リサイズされた画像 (RGB)。 """ # NumPy配列からPILイメージに変換 pil_image = Image.fromarray(image) resized_image = pil_image.resize((int(width), int(height))) return np.array(resized_image) # --- Interface ----------------------------------------------------------- resize_interface = gr.Interface( fn=resize_image, inputs=[ gr.Image(), gr.Number(label="幅", value=300), gr.Number(label="高さ", value=300), ], outputs=gr.Image(), api_name="resize_image", ) demo = gr.TabbedInterface( [ gr.Interface(reverse_text, gr.Textbox(), gr.Textbox(), api_name="reverse_text"), gr.Interface(generate_qr_code, gr.Textbox(), gr.Image(), api_name="generate_qr_code"), gr.Interface(count_words, gr.Textbox(), gr.Number(), api_name="count_words"), resize_interface, ], [ "テキスト反転", "QRコード生成", "単語数カウント", "画像リサイズ", ], ) if __name__ == "__main__": # mcp_server=True starts the SSE endpoint at /gradio_api/mcp/sse demo.launch(mcp_server=True)