File size: 2,710 Bytes
16a8ae4
00c86c6
 
05d9ddd
00c86c6
0316e9d
0aa210d
16a8ae4
477dcb8
f77dc2b
2dd8a35
 
0aa210d
 
16a8ae4
0aa210d
 
 
2dd8a35
eb5d4ba
0d4b0ba
477dcb8
16a8ae4
 
0a3b739
f77dc2b
2dd8a35
 
0a3b739
477dcb8
2dd8a35
477dcb8
2dd8a35
 
f77dc2b
2dd8a35
f77dc2b
477dcb8
0a3b739
16a8ae4
53bb294
16a8ae4
 
d0a94a5
25db6c9
00c86c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
80
from PIL import Image
import numpy as np
import cv2
from rembg import remove

def background_removal(input_image_path):
    """
    指定された画像から背景を除去し、透明部分を白背景にブレンドして返す関数。
    小さなドットや、指定のアルファ閾値以下の小さな半透明領域も無視してトリミングを行います。

    Parameters:
    - input_image_path: 背景除去する画像のパス
    """
    try:
        input_image = Image.open(input_image_path).convert("RGBA")
    except IOError:
        print(f"Error: Cannot open {input_image_path}")
        return None
        
    area_threshold=100 # 無視する小さい領域のピクセル数の閾値
    alpha_threshold=200 # 無視する小さい領域のピクセル数の閾値

    # 背景除去処理
    result = remove(input_image)

    # アルファチャンネル取得
    alpha = result.split()[-1]  # アルファチャンネルを取得
    bbox = alpha.getbbox()
    if bbox:
        # bbox 内の非透過ピクセルをカウント (alpha_threshold より大きいピクセルのみ)
        cropped_alpha = alpha.crop(bbox)
        non_transparent_pixel_count = sum(1 for pixel in cropped_alpha.getdata() if pixel >= alpha_threshold)
        
        # 指定した閾値以上の領域がある場合のみトリミング
        if non_transparent_pixel_count >= area_threshold:
            result = result.crop(bbox)
        else:
            print("Small or semi-transparent region ignored")

    # 結果を一時ファイルに保存
    result_path = "tmp.png"
    result.save(result_path)

    return result_path

def resize_image_aspect_ratio(image):
    # 元の画像サイズを取得
    original_width, original_height = image.size

    # アスペクト比を計算
    aspect_ratio = original_width / original_height

    # 標準のアスペクト比サイズを定義
    sizes = {
        1: (1024, 1024),  # 正方形
        4/3: (1152, 896),  # 横長画像
        3/2: (1216, 832),
        16/9: (1344, 768),
        21/9: (1568, 672),
        3/1: (1728, 576),
        1/4: (512, 2048),  # 縦長画像
        1/3: (576, 1728),
        9/16: (768, 1344),
        2/3: (832, 1216),
        3/4: (896, 1152)
    }

    # 最も近いアスペクト比を見つける
    closest_aspect_ratio = min(sizes.keys(), key=lambda x: abs(x - aspect_ratio))
    target_width, target_height = sizes[closest_aspect_ratio]

    # リサイズ処理
    resized_image = image.resize((target_width, target_height), Image.LANCZOS)

    return resized_image


def base_generation(size, color):
    canvas = Image.new("RGBA", size, color) 
    return canvas