| 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 |
|
|