"""Gera o fundo night.jpg do Freaky Towers (substitui a foto do Unsplash): ceu noturno em degrade com nuvens de ruido, estrelas e uma lua. Obra nossa, dedicada ao dominio publico (CC0 1.0). Usa so o Pillow. Uso: python make-night.py night.jpg""" import random import sys from PIL import Image, ImageChops, ImageDraw, ImageFilter W, H = 1125, 2000 random.seed(1307) # Degrade vertical (azul-noite no alto, roxo escuro embaixo). grad = Image.linear_gradient("L").resize((W, H)) top, bot = Image.new("RGB", (W, H), (6, 9, 28)), Image.new("RGB", (W, H), (36, 26, 64)) img = Image.composite(bot, top, grad) # Nuvens: ruido borrado em duas escalas, so os picos viram nuvem. def cloud_layer(scale, blur, gain): n = Image.effect_noise((W // scale, H // scale), 90).filter(ImageFilter.GaussianBlur(blur)) n = n.resize((W, H), Image.BICUBIC) return n.point(lambda v: max(0, min(255, int((v - 128) * gain)))) clouds = ImageChops.add(cloud_layer(8, 3, 3.0), cloud_layer(3, 2, 2.0), scale=2) tint = Image.new("RGB", (W, H), (96, 96, 140)) img = Image.composite(tint, img, clouds.point(lambda v: v * 40 // 100)) # Estrelas. d = ImageDraw.Draw(img) for _ in range(220): x, y = random.randrange(W), random.randrange(H) c = random.randrange(110, 230) r = random.choice((0, 0, 0, 1)) d.ellipse((x - r, y - r, x + r, y + r), fill=(c, c, min(255, c + 20))) # Lua com halo. halo = Image.new("L", (W, H), 0) ImageDraw.Draw(halo).ellipse((780 - 90, 520 - 90, 780 + 90, 520 + 90), fill=110) halo = halo.filter(ImageFilter.GaussianBlur(70)) img = Image.composite(Image.new("RGB", (W, H), (120, 130, 190)), img, halo) d = ImageDraw.Draw(img) d.ellipse((780 - 60, 520 - 60, 780 + 60, 520 + 60), fill=(232, 232, 220)) d.ellipse((780 - 22, 520 - 20, 780 - 2, 520 + 2), fill=(214, 214, 204)) d.ellipse((780 + 10, 520 + 14, 780 + 34, 520 + 38), fill=(220, 220, 209)) img.save(sys.argv[1], quality=88, optimize=True)