from PIL import Image # Wymiary (bez zmian) SZEROKOSC = 1280 WYSOKOSC_PLYNNA = 1080 WYSOKOSC_CZARNA = 720 WYSOKOSC_GRADIENTU = WYSOKOSC_PLYNNA - WYSOKOSC_CZARNA # 360 # Stopień nieliniowości (im wyższy, tym wolniejszy spadek na początku) # 1.0 = Liniowy, 2.0 = Quadratic (Wolniejszy start, szybszy koniec), 3.0 = Cubic WSPOLCZYNNIK_EASING = 2.5 # 1. Utwórz przezroczysty obraz img = Image.new('RGBA', (SZEROKOSC, WYSOKOSC_PLYNNA), (0, 0, 0, 0)) pixels = img.load() # 2. Ustaw w pełni czarny obszar (bez zmian) for x in range(SZEROKOSC): for y in range(WYSOKOSC_CZARNA): pixels[x, y] = (0, 0, 0, 255) # 3. Zmodyfikowany gradient nieliniowy (Ease-In, czyli spowolnienie na początku) for y in range(WYSOKOSC_CZARNA, WYSOKOSC_PLYNNA): # 1. Oblicz współrzędną w zakresie 0.0 do 1.0 (liniowo) y_gradient = y - WYSOKOSC_CZARNA wspolczynnik_liniowy = y_gradient / WYSOKOSC_GRADIENTU # 0.0 na 720px, 1.0 na 1080px # 2. Zastosuj funkcję nieliniową (np. Power/Expo Ease-In) # Ta funkcja powoduje, że 'współczynnik_nieliniowy' rośnie wolniej na początku. wspolczynnik_nieliniowy = wspolczynnik_liniowy ** WSPOLCZYNNIK_EASING # 3. Konwersja na krycie (alpha) # Ponieważ chcemy, by krycie MALAŁO od 255 do 0: # Używamy 1.0 - wspolczynnik_nieliniowy (czyli od 1.0 do 0.0) krycie_skalarne = 1.0 - wspolczynnik_nieliniowy alpha = int(255 * krycie_skalarne) # Zastosuj krycie for x in range(SZEROKOSC): # Użyj maks. 0, aby uniknąć ujemnych wartości na wszelki wypadek pixels[x, y] = (0, 0, 0, max(0, alpha)) # Zapisz obraz img.save('mask.png')