# -*- coding: utf-8 -*- """ Final FB: scena z wstawiona przez AI postacia (_fb_v3_base.jpg) + prawdziwa twarz mamy z mama.jpg (ta sama poza picia). """ import numpy as np from PIL import Image, ImageFilter, ImageDraw BASE = "reklama_facebook/_fb_v3_base.jpg" MAMA = "reklama_facebook/mama.jpg" OUT = "reklama_facebook/FB_post_SKUP_GRZYBOW_mama_final_1080x1350.jpg" # oczy: wygenerowana (w 1080x1350) vs prawdziwa (w mama.jpg) GEN_L, GEN_R = (330, 855), (398, 855) MAM_L, MAM_R = (353, 273), (447, 260) base = Image.open(BASE).convert("RGB") mama = Image.open(MAMA).convert("RGB") # --- rotacja mamy: wyrownanie linii oczu do poziomu sceny --- ang_m = np.degrees(np.arctan2(MAM_R[1] - MAM_L[1], MAM_R[0] - MAM_L[0])) ang_g = np.degrees(np.arctan2(GEN_R[1] - GEN_L[1], GEN_R[0] - GEN_L[0])) rot = ang_g - ang_m # PIL rotate: +CCW mrot = mama.rotate(rot, resample=Image.BICUBIC, expand=False) # nowe polozenie punktu srodkowego oczu po rotacji wokol srodka obrazu cx, cy = mama.width / 2, mama.height / 2 mx, my = (MAM_L[0] + MAM_R[0]) / 2, (MAM_L[1] + MAM_R[1]) / 2 vx, vy = mx - cx, my - cy r = np.radians(rot) mx2 = cx + vx * np.cos(r) - vy * np.sin(r) my2 = cy + vx * np.sin(r) + vy * np.cos(r) # --- skala --- d_m = np.hypot(MAM_R[0] - MAM_L[0], MAM_R[1] - MAM_L[1]) d_g = np.hypot(GEN_R[0] - GEN_L[0], GEN_R[1] - GEN_L[1]) s = d_g / d_m nw, nh = int(mrot.width * s + .5), int(mrot.height * s + .5) msc = mrot.resize((nw, nh), Image.LANCZOS).convert("RGBA") mx2, my2 = mx2 * s, my2 * s # --- kolor: cieple, wieczorne swiatlo sceny --- a = np.array(msc).astype(np.float32) a[..., 0] *= 1.10; a[..., 1] *= 1.03; a[..., 2] *= 0.90 a[..., :3] = np.clip((a[..., :3] - 128) * 1.04 + 132, 0, 255) msc = Image.fromarray(a.astype(np.uint8), "RGBA") # --- maska: elipsa na twarz + kieliszek, mocne wygaszanie --- mask = Image.new("L", msc.size, 0) d = ImageDraw.Draw(mask) ex, ey = mx2, my2 d.ellipse([ex - 105, ey - 130, ex + 115, ey + 150], fill=255) mask = mask.filter(ImageFilter.GaussianBlur(14)) gx, gy = (GEN_L[0] + GEN_R[0]) / 2, (GEN_L[1] + GEN_R[1]) / 2 base.paste(msc, (int(gx - mx2), int(gy - my2)), mask) base.save(OUT, quality=95) base.resize((540, 675), Image.LANCZOS).save( "reklama_facebook/FB_post_mama_final_podglad.jpg", quality=90) print("zapisano:", OUT)