# -*- coding: utf-8 -*- """ Montaz zarty: mama (realne wyciecie ze zdjecia) wklejona do gotowej grafiki FB skupu grzybow. Wyjscie: FB_post_SKUP_GRZYBOW_mama_1080x1350.jpg """ import numpy as np from PIL import Image, ImageDraw, ImageFilter, ImageEnhance, ImageFont W, H = 1080, 1350 BASE = "reklama_facebook/FB_post_SKUP_GRZYBOW_1080x1350.jpg" MAMA = "reklama_facebook/mama_wycieta.png" OUT = "reklama_facebook/FB_post_SKUP_GRZYBOW_mama_1080x1350.jpg" FONT_BOLD = "fonts/Montserrat-Bold.ttf" FIG_H = 560 # wysokosc figury na kanwie FIG_X = 30 # lewy skraj FIG_BOTTOM = 1352 # dol lekko za krawedzia kadru def build(): canvas = Image.open(BASE).convert("RGBA") mama = Image.open(MAMA).convert("RGBA") # obetnij do figury i odbij w poziomie (patrzy w strone skupu) bbox = mama.getbbox() fig = mama.crop(bbox).transpose(Image.FLIP_LEFT_RIGHT) sc = FIG_H / fig.height fig = fig.resize((int(fig.width * sc), FIG_H), Image.LANCZOS) # przesun linie engagement — mama zaslania srodek patch = Image.new("RGBA", canvas.size, (0, 0, 0, 0)) pd = ImageDraw.Draw(patch) pd.ellipse([130, 1250, 850, 1360], fill=(9, 15, 12, 245)) pd.rectangle([140, 1290, 850, 1350], fill=(9, 15, 12, 250)) canvas.alpha_composite(patch.filter(ImageFilter.GaussianBlur(22))) f_sm = ImageFont.truetype(FONT_BOLD, 26) d = ImageDraw.Draw(canvas) txt = "Udostępnij znajomemu grzybiarzowi!" bb = f_sm.getbbox(txt) d.text((765 - (bb[0] + bb[2]) / 2, 1305 - (bb[1] + bb[3]) / 2), txt, font=f_sm, fill=(210, 220, 212, 255)) # korekcja koloru pod scene (cieplej, mocniejszy kontrast) rgb = fig.convert("RGB") a = np.asarray(rgb).astype(np.float32) a[..., 0] *= 1.05 a[..., 1] *= 1.00 a[..., 2] *= 0.93 a += np.array([5, 0, -3], dtype=np.float32) rgb = Image.fromarray(np.clip(a, 0, 255).astype(np.uint8)) rgb = ImageEnhance.Contrast(rgb).enhance(1.05) rgb = ImageEnhance.Brightness(rgb).enhance(1.03) fig = Image.merge("RGBA", (*rgb.split(), fig.split()[3])) fy = FIG_BOTTOM - FIG_H # miekki cien za sylwetka (kontakt ze scena) sh = Image.new("RGBA", canvas.size, (0, 0, 0, 0)) alpha = fig.split()[3].point(lambda v: int(v * 0.55)) sh.paste(Image.new("RGBA", fig.size, (10, 14, 10, 255)), (FIG_X + 26, fy + 30), alpha) canvas.alpha_composite(sh.filter(ImageFilter.GaussianBlur(26))) canvas.alpha_composite(fig, (FIG_X, fy)) # lekka poswiata u stop figury — osadzenie w gruncie g = Image.new("RGBA", canvas.size, (0, 0, 0, 0)) ImageDraw.Draw(g).ellipse( [FIG_X - 60, H - 120, FIG_X + fig.width + 40, H + 60], fill=(6, 10, 8, 110)) canvas.alpha_composite(g.filter(ImageFilter.GaussianBlur(40))) canvas.convert("RGB").save(OUT, quality=93) canvas.convert("RGB").resize((W // 2, H // 2), Image.LANCZOS).save( "reklama_facebook/FB_post_mama_podglad.jpg", quality=88) print("zapisano:", OUT) if __name__ == "__main__": build()