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