gacha-forge / generators /common.py
Amit9011's picture
Update generators/common.py
b2e6df9 verified
Raw
History Blame Contribute Delete
1.91 kB
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