File size: 1,910 Bytes
732ca45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import io
from PIL import Image, ImageDraw, ImageOps, ImageEnhance
from .base import BaseGenerator

class CommonGenerator(BaseGenerator):
    def build_template(self, image_data: bytes, element: str) -> Image.Image:
        r_color = self.ELEMENT_COLORS.get(element, (156, 163, 175))
        
        canvas = Image.new("RGBA", (self.CANVAS_W, self.CANVAS_H), (0, 0, 0, 0))

        char_raw = Image.open(io.BytesIO(image_data)).convert("RGBA")
        if char_raw.size != (self.CARD_W, self.CARD_H):
            char_base = ImageOps.fit(char_raw, (self.CARD_W, self.CARD_H), centering=(0.5, 0.15))
        else:
            char_base = char_raw
            
        char_base = ImageEnhance.Contrast(char_base).enhance(1.05)

        banner_crop = char_base.crop((0, self.CARD_H - self.BANNER_H, self.CARD_W, self.CARD_H))
        gradient = Image.new("RGBA", banner_crop.size, (20, 20, 25, 200))
        banner_img = Image.alpha_composite(banner_crop, gradient)
        
        banner_draw = ImageDraw.Draw(banner_img)
        banner_draw.line([(0, 0), (self.CARD_W, 0)], fill=r_color + (255,), width=2)
        banner_img.putalpha(self.create_bottom_rounded_mask(banner_img.size, self.CORNER_RAD))

        char_base.putalpha(self.create_rounded_mask((self.CARD_W, self.CARD_H), self.CORNER_RAD))
        canvas.paste(char_base, (self.OFFSET_X, self.OFFSET_Y), char_base)
        canvas.paste(banner_img, (self.OFFSET_X, self.OFFSET_Y + self.CARD_H - self.BANNER_H), banner_img)

        ui_layer = Image.new("RGBA", (self.CANVAS_W, self.CANVAS_H), (0, 0, 0, 0))
        uid = ImageDraw.Draw(ui_layer)
        uid.rounded_rectangle(
            (self.OFFSET_X, self.OFFSET_Y, self.OFFSET_X + self.CARD_W, self.OFFSET_Y + self.CARD_H), 
            radius=self.CORNER_RAD, 
            outline=r_color + (200,), 
            width=2
        )
        canvas.alpha_composite(ui_layer)

        return canvas