import gradio as gr import requests import tempfile import os import cv2 import numpy as np def resize_img(img): h_base, w_base = (315, 420) # 表示したい画像サイズ h, w = img.shape[:2] # 読み込み画像サイズ if h!=h_base and w!=w_base: # 画像サイズが違う画像はリサイズ # 基本サイズが縦の方が小さいので縦に合わせるように倍率を縮小 out_img = cv2.resize(img, None, None, h_base/h, h_base/h) r_w = out_img.shape[1] # リサイズ後の横幅 if r_w > w_base: # 横サイズが大きい場合はトリミング out_img = out_img[:,int((r_w-w_base)/2):int((r_w+w_base)/2)] elif r_w < w_base: # 横サイズが小さい場合は白で埋める tmp = out_img # 白で埋める out_img = np.uint8(np.array([[[255]*3]*w_base]*h_base)) out_img[:,int((w_base-r_w)/2):int((w_base+r_w)/2)] = tmp else: # 画像サイズが同じ場合はスルー out_img = img # RGBに変換 rgb_img = cv2.cvtColor(out_img, cv2.COLOR_BGR2RGB) return rgb_img def imread_web(url): # 画像をリクエストする res = requests.get(url) img = None # Tempfileを作成して即読み込む fp = tempfile.NamedTemporaryFile(dir='./', delete=False) fp.write(res.content) fp.close() img = cv2.imread(fp.name) os.remove(fp.name) return img def url2img(url): return resize_img(imread_web(url)) demo = gr.Interface(fn=url2img, inputs='text', outputs='image') gr.Error("custom message") demo.launch()