From 720fb0ecb24ab7037e0d626afc853f493c496278 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 17 Jul 2026 13:24:08 +0300 Subject: [PATCH] =?UTF-8?q?minor:=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B0=D1=8F=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F.=20=D0=9A=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=C2=A0=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D1=87=D1=83=D1=82=D1=8C=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D1=87=D0=B5,=20=D1=82.=E2=80=89=D0=BA.=C2=A0=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=C2=A0=D0=B8=D1=85=C2=A0=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=20=D0=BD=D0=B5=C2=A0=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=86=D0=B8=D1=84=D1=80=D1=8B?= =?UTF-8?q?,=20=D0=BD=D0=BE=C2=A0=D0=B8=C2=A0=D0=B1=D1=83=D0=BA=D0=B2?= =?UTF-8?q?=D1=8B=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ img/img_2j.svg | 2 +- main.py | 23 +++++++++++++++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4b5b5ff..02acc53 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ Генерирует SVG халфтоновый эффект из изображения с анимацией мерцания точек. +Например: + +![Пример](img/img_2j.svg) + ## Что делает Скрипт преобразует любое изображение в компактный SVG с: diff --git a/img/img_2j.svg b/img/img_2j.svg index 53bf459..b3a1841 100644 --- a/img/img_2j.svg +++ b/img/img_2j.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/main.py b/main.py index c99b2f1..0874ab4 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,23 @@ import sys from PIL import Image + +def encode_to_base36(num): + """Кодирует число в base-36: 0-9, A-Z, a-z""" + if num < 0: + raise ValueError("Number must be non-negative") + + charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + if num < len(charset): + return charset[num] + + result = [] + while num > 0: + result.append(charset[num % len(charset)]) + num //= len(charset) + return ''.join(reversed(result)) + + def generate_halftone_svg(image_path, output_path, cols=80, max_radius=6, animation_variants=12): import random @@ -20,7 +37,8 @@ def generate_halftone_svg(image_path, output_path, cols=80, max_radius=6, animat animation_classes = [] for i in range(animation_variants): delay = (i / animation_variants) * 3 - animation_classes.append(f".a{i}{{--d:{delay:.2f}s}}") + encoded_i = encode_to_base36(i) + animation_classes.append(f".a{encoded_i}{{--d:{delay:.2f}s}}") for y in range(rows): for x in range(cols): @@ -36,8 +54,9 @@ def generate_halftone_svg(image_path, output_path, cols=80, max_radius=6, animat # Каждой точке свой класс с уникальной задержкой anim_class = random.randint(0, animation_variants - 1) + encoded_class = encode_to_base36(anim_class) svg_elements.append( - f'' + f'' ) animation_css = "".join(animation_classes)