4SplitImage / app.py
tori29umai's picture
Update app.py
d5da9f4 verified
import gradio as gr
from PIL import Image, ImageOps
import os
import zipfile
def save_image(image, path):
# 画像の保存 (PNG形式で保存)
image.save(path, format='PNG')
def process_image(image):
# 元の画像のサイズ
original_width, original_height = image.size
# 新しいサイズ
target_width, target_height = 252, 144
# 分割後の画像を格納するリスト
outputs = []
# 画像を4つのセクションに分割するための新しいサイズ
new_width = original_width // 2
new_height = original_height // 2
# 画像を4つのセクションに分割
for i in range(2):
for j in range(2):
left = new_width * j
upper = new_height * i
right = new_width * (j + 1)
lower = new_height * (i + 1)
# 画像を切り取る
cropped_image = image.crop((left, upper, right, lower))
# アスペクト比を保ちながら、リサイズ
cropped_image.thumbnail((target_width, target_height), Image.Resampling.LANCZOS)
# 新しい黒背景を作成
black_background = Image.new('RGBA', (target_width, target_height), (0, 0, 0, 255))
# 余白の追加を左上、左下、右上、右下に対応
if i == 0 and j == 0: # 左上
left_offset = (target_width - cropped_image.width) # 右側に余白
top_offset = (target_height - cropped_image.height) # 下側に余白
elif i == 1 and j == 0: # 左下
left_offset = (target_width - cropped_image.width) # 右側に余白
top_offset = 0 # 上側に余白
elif i == 0 and j == 1: # 右上
left_offset = 0 # 左側に余白
top_offset = (target_height - cropped_image.height) # 下側に余白
elif i == 1 and j == 1: # 右下
left_offset = 0 # 左側に余白
top_offset = 0 # 上側に余白
# 中心に元画像を貼り付け
black_background.paste(cropped_image, (left_offset, top_offset))
outputs.append(black_background)
# 出力される4つの画像を返す
return outputs[0], outputs[1], outputs[2], outputs[3]
def zip_files(zip_files, zip_path):
with zipfile.ZipFile(zip_path, 'w') as zipf:
for file_path in zip_files:
zipf.write(file_path, arcname=os.path.basename(file_path))
class webui:
def __init__(self):
self.demo = gr.Blocks()
def main(self, image_path):
image = Image.open(image_path)
# 拡張子を取り除いたファイル名を取得
image_name = os.path.splitext(image_path)[0]
# 画像を処理
output1, output2, output3, output4 = process_image(image)
# 保存先のパスを作成
output1_path = f"{image_name}_1.png"
output2_path = f"{image_name}_2.png"
output3_path = f"{image_name}_3.png"
output4_path = f"{image_name}_4.png"
# 画像を保存(PNG形式で保存)
save_image(output1, output1_path)
save_image(output2, output2_path)
save_image(output3, output3_path)
save_image(output4, output4_path)
# 保存したファイルをリストに追加
zip_files_list = [output1_path, output2_path, output3_path, output4_path]
zip_path = f"{image_name}.zip"
zip_files(zip_files_list, zip_path)
# 出力として画像とzipファイルを返す
outputs = [output1, output2, output3, output4]
return outputs, zip_path
def launch(self, share):
with self.demo:
with gr.Row():
with gr.Column():
input_image = gr.Image(type='filepath')
submit = gr.Button(value="Start")
with gr.Row():
with gr.Column():
with gr.Tab("output"):
output_0 = gr.Gallery(format="png")
output_file = gr.File()
submit.click(
self.main,
inputs=[input_image],
outputs=[output_0, output_file]
)
self.demo.queue()
self.demo.launch(share=share)
if __name__ == "__main__":
ui = webui()
ui.launch(share=True)