Статья
glyph art
glyph art делит картинку или видео на сетку ячеек, замеряет тон каждой ячейки и рисует на её месте один знак. Тон передаёт размер знака: точка там, где тише всего, и жирная отметина там, где громче всего. Это ASCII-арт, только работает размер, а не выбор символа.
Есть и второй режим — halftone. Он устроен совершенно иначе: ни ячеек, ни знаков, ни лестницы, только повёрнутый растр из точек. Про него отдельная глава ближе к концу.
Всё считается прямо в браузере. Файлы, которые вы открываете, остаются на вашей машине — странице запрещено самой открывать соединения. Единственное, что она подгружает, — собственные векторные знаки пресетов с того же адреса, и только когда вы выбрали пресет.
Если что-то не открывается, проверка браузера покажет, чего в нём не хватает.
Загрузить исходник
Бросьте файл в любое место холста или откройте его через панель source. Читаются MP4, MOV, WebM, PNG, JPEG и WebP. SVG годится для знаков, но не для исходника: браузеры не берутся надёжно растрировать его в битмап.
Декодирует видео браузер, а не сам инструмент. Если MP4 или MOV не открывается, перегоните его в H.264 или выгрузите из монтажки секвенцию картинок.
frame width задаёт ширину вывода от 256 до 4096 px, высота идёт от исходника. Сетка по-прежнему решает, сколько знаков помещается поперёк, а ширина кадра — сколькими пикселями эти знаки описаны. Холст, на который вы смотрите, и есть экспортируемый кадр. Кнопки − / процент / + приближают его от 25% до 800% для рассматривания и не меняют экспорт.
У каждой числовой настройки есть и ползунок, и поле ввода. Наберите значение и нажмите Enter или выйдите из поля, чтобы применить его.
Сетка
cells — сколько ячеек помещается по ширине, от 1 до 240. Высота считается из пропорций исходника. Начинать удобно с 72: на 72 лицо ещё читается, ближе к 48 превращается в абстракцию, после 120 — в текстуру. Когда на ячейку остаётся меньше восьми пикселей, знаки перестают читаться как знаки и лучше взять printor; панель об этом предупредит.
column gap и row gap добавляют бумагу между знаками — в долях собственной ячейки знака: 1 — промежуток шириной в ячейку. Промежуток не уменьшает знаки: каждый сохраняет размер, который даёт cells, просто в сетку их помещается меньше. Один только row gap превращает картинку в строки печати с белым между ними — как интерлиньяж в газетной колонке.
hand расшатывает сетку. Это одна ручка на три вещи сразу — небольшой поворот, небольшое смещение и небольшое изменение размера, и всё это разыгрывается для каждой ячейки отдельно. На нуле получается машина. Около 0.35 читается как штамп, поставленный рукой.
Важно, что hand разыгрывается на ячейку, а не на кадр. При проигрывании он стоит на месте. Если бы он пересчитывался каждый кадр, вся поверхность кипела бы, и это выглядело бы шумом, а не рукой.
Тон
В какую полосу попадёт ячейка, решают три параметра.
levels — чёрная и белая точки. Он выставляется автоматически при загрузке, по 1-му и 99-му процентилю тонов ячеек: плоская фотография, порезанная на семь полос, займёт от силы четыре и будет выглядеть мёртвой, поэтому это делается ещё до того, как вы что-то увидите. Двумя ползунками можно переопределить. Если исходник действительно плоский, автоподбор его не трогает, а не вытягивает шум.
bands — на сколько тонов режется картинка, от 2 до 24. Три — это плакат, двенадцать — растр, семь — лестница, у которой видно каждую ступеньку. Смена числа полос растягивает уже собранную лестницу, а не сбрасывает её.
weight гнёт всю лестницу целиком. Меньше — печатает плотнее, больше — легче и воздушнее. После levels это самая полезная ручка, и лента тонов обновляется на ходу, так что видно, что именно она делает.
max mark — насколько знаку позволено вылезать за свою ячейку. Обрезается он при этом никогда: знаки штампуются в одну маску во весь кадр, так что крупный просто ложится поверх соседей. Но после примерно 1.2 они сплавляются в массу и перестают читаться поштучно. max ink — другой конец того же вопроса: какую долю своей ячейки просит закрасить самая тёмная полоса.
Эти двое и мирит кнопка fit ramp. Она поднимает max ink ровно до того предела, за которым первый же знак вылез бы за max mark, — и проверяет все полосы и все знаки, а не только самую тёмную. Разреженный знак в середине лестницы упирается в потолок задолго до нижней полосы. Нажмите её после загрузки своего набора, и лестница поднимется настолько, насколько эти знаки её вытягивают. Набор из тонких линий встанет на более светлую лестницу, чем набор из плашек, и это правда про эти знаки, а не неудача с чёрным.
Тона усредняются в линейном свете, а на полосы режутся в перцептивной светлоте. Знать это необязательно, но именно поэтому средние тона тут не забиваются так, как обычно бывает в подобных инструментах.
Лента тонов
Полоса внизу — это и есть инструмент. По колонке на каждую полосу тона, слева самая светлая, справа самая тёмная.
В каждой колонке знак нарисован того размера, которым он реально напечатается, относительно ячейки. Прочитайте ячейки слева направо — вы смотрите прямо на кривую тона.
Число под ячейкой — этот размер в процентах от ячейки. Всё, что больше 100%, залезает на соседей, и это сделано нарочно: самая тёмная полоса обязана переливаться через край, иначе тени рассыпаются в горошек вместо того, чтобы собраться в массу. Насколько далеко это заходит, задаёт max mark; у пресетов он держится на 1.15, поэтому их знаки остаются счётными.
- Полоса 0 по умолчанию пустая и подписана
paper. Бумага — это тоже тон, и пустая верхняя полоса — главное, из-за чего первый же результат выглядит печатью. - Ползунок в колонке задаёт размер полосы руками. Рядом с числом появляется
·— знак того, что полоса сошла с кривой.rebalanceвозвращает все полосы обратно. !в углу ячейки значит, что знак слишком разрежен и не добирает тон полосы даже на максимальном размере.
Почему размер — это не просто тон
Потому что покрытие чернилами растёт как квадрат размера. Если отобразить тон прямо в размер, ячейка с половинным тоном получит четверть нужных чернил: средние тона выцветут, тени схлопнутся.
Поэтому каждая полоса просит закрасить определённую долю своей ячейки, а размер решается обратно — из этой доли и собственной плотности знака, которая замеряется при его загрузке. Благодаря этому точка, крест и сплошной квадрат живут на одной лестнице, и ни один из них не читается на две полосы мимо.
Пресеты
Пресеты — это эпохи русской военной истории: 1700–1812 (Северная и Отечественная войны), Крымская, Русско-турецкая, Русско-японская и Первая мировая, Гражданская, локальные конфликты 1936–1940 годов (Испания, Халхин-Гол, Финляндия), Великая Отечественная и Корея, Вьетнам, Ближний Восток, Афганистан. Каждая — литеры своей войны: буквы, цифры, печати, орнаменты, вырезанные из газет, указов и плакатов того времени и разложенные по двенадцати уровням. Все эпохи, кроме Гражданской, есть в двух вариантах: только русская печать — и та же печать с иностранной той же войны.
Выбор набора меняет знаки и форму их лестницы, и больше ничего. Сетка, уровни, инверсии и ваш исходник остаются на месте, так что наборы можно перещёлкивать и сравнивать.
Печатается каждый русский знак эпохи. Ничего не отбирается и ничего не выбрасывается: каждый знак ложится на тот уровень, где он печатается, самые плотные — на самые тёмные, так что на уровне сотни разных оттисков и две соседние ячейки одного тона вряд ли получат один и тот же.
Больше всего внимания — самым тёмным уровням: там знаки печатаются крупнее всего, и повтор бросается в глаза именно там. Столько краски в пределах ячейки дают только самые жирные литеры, поэтому на трёх самых тёмных уровнях знак может вырасти за ячейку — до полутора, где тени и должны срастаться в массу, — а сами эти уровни добираются до глубины остальных знаками со светлых уровней, напечатанными ещё раз, крупнее. Туда попадают только чёткие оттиски достаточного размера: мягкий скан, растянутый за ячейку, превращается в пятно, поэтому он уходит на уровень светлее и печатается мелко.
Каждая ячейка выбирает из всего своего уровня, но не всякий знак с равной вероятностью. Газетный текст — это в основном одни и те же несколько букв, и уровень, нарезанный из него, состоит в основном из их оттисков: при случайном выборе картинка сложилась бы из нескольких десятков начертаний по кругу. Поэтому знаки уровня сгруппированы по начертанию, и ячейка сначала выбирает начертание — все равновероятны, — а потом один из его оттисков. Печатается по-прежнему каждый знак; просто редкие буквы и шрифты выпадают так же часто, как частые.
Там, где знаки отбираются из горстки сканов, выбранных руками, знаки на уровне подобраны максимально непохожими друг на друга, а не просто теми, что печатают его лучше всех. Это важнее, чем кажется: печатаются все знаки уровня, сменяя друг друга от ячейки к ячейке, — так что уровень, набранный с верха рейтинга, оказывается десятью оттисками одной буквы. По счёту десять знаков, на глаз один.
На какой уровень попадёт знак — свойство не знака, а того размера, в котором он должен напечататься, чтобы дать нужную этому уровню заливку. Разреженная буква добирается до светлого уровня в удобном размере, а до тёмного — только вылезая за ячейку; сплошная плашка ровно наоборот. У каждого скана замеряется краска, пропорция и толщина штриха, и уровень берёт те знаки, что укладываются в печатный размер со штрихом, который переживёт растр.
Та же арифметика сама уводит вытянутые знаки в светлый конец, и никто при этом на пропорцию не смотрит. Знак вписывается в квадратную ячейку по длинной стороне, поэтому вдвое-с-половиной более широкий, чем высокий, достаёт по другой стороне лишь на две пятых и кладёт две пятых той краски, что обещает его плотность.
У каждого набора свой max ink, потому что это факт про материал: воздушная высокая печать не закрывает столько же ячейки, сколько сплошная доска, не вылезая за неё. Эпоха воздушной печати светлее именно по этой причине и настоящего чёрного не даст; эпохи, нарезанные из плотных газетных полос, плотнее, потому что в газетной наборной кассе есть по-настоящему жирные литеры. Это литеры, а не инструмент.
Иностранная печать
У войны две стороны, и печатали обе. Второй пресет эпохи оставляет русскую лестницу как есть и подмешивает печать другой стороны: Le Moniteur universel для 1812 года, The London Gazette для Крыма, османскую газету для русско-турецкой войны, Асахи симбун и Deutsche Kriegszeitung для 1904–1918, испанскую, финскую, монгольскую и японскую печать для конфликтов 1936–1940, немецкую прессу для 1941–1945 и корейские, вьетнамские, арабские, ивритские и афганские газеты для войн после неё. Иностранных знаков никогда не больше 30% уровня, и уровень никогда не отмеряется по ним, так что они читаются как вкрапления в русской фактуре, а не как вторая фактура поверх. Это ровная выборка из того, что печатает каждая полоса, а не самое броское в ней: самое броское на полосе — её кляксы.
Цена всего этого — вес. Эпоха — несколько мегабайт листов, загружается только когда её выбрали, и на медленной связи это заметно.
Никто эти буквы не распознавал. Полоса со снятым фоном — это краска на прозрачном, значит буква и есть связный островок краски, а поиск таких островков — обычная морфология изображения, около десятой доли секунды на полосу. Инструменту незачем знать, какая это буква: он назначает размер по замеренной краске, а не по имени знака.
Пространственный переход между steps
Включите blend steps across the image в панели step gradient, чтобы пройти через все исторические наборы внутри одной картинки. Это переход по пространству, не по времени. Начальный порядок: Великая Отечественная, Гражданская война, остальные эпохи и последним — Digital reactions.
Выберите направление, переставьте исторические steps стрелками и выберите русскую или иностранную печать каждой эпохи. transition задаёт ширину смешивания: 0 — отдельные области, 1 — смешивание на всём переходе. Соседние наборы обмениваются целыми знаками, а не прозрачностью: серых символов не возникает. Тон исходника по-прежнему задаёт размер. weight, max ink, max mark, levels, интервалы, инверсии и анимация сетки работают как раньше. fit ramp проверяет все steps. Редактор полос возвращается после отключения перехода; ваша собственная лестница не перезаписана. Выбор отдельного пресета тоже отключает переход, но сохраняет его порядок.
Последний step содержит упрощённые монохромные огонёк и press F / салют, отдельный глазик просмотров и отдельные счётчики — глазик с цифрами не соединяется. В каждом счётчике ровно две цифры: 17k или 1,7k, но не 17,1k. Все 180 значений доступны на каждом уровне. Самые мелкие три уровня используют только счётчики, без крошечных смайликов. В самых тёмных уровнях 65% знаков — счётчики; остальные — огонёк, press F по авторской трассировке и отдельный глазик. Счётчики сделаны контурами Roboto Medium — установленный шрифт не нужен. Все новые знаки экспортируются собственными SVG-контурами: без текста, эмодзи, внешних шрифтов и встроенных картинок. Исторические и церковнославянские сканы тоже заранее переведены в вектор: превью, PNG, MP4 и SVG используют одни и те же подготовленные контуры.
При первом включении загружаются векторные наборы выбранных steps, поэтому ожидание дольше, чем у одного пресета. Экспорт доступен после загрузки знаков. save, share, отмена и возврат сохраняют настройки перехода. SVG остаётся текущим кадром; PNG и MP4 сохраняют прежнее поведение последовательности.
Знаки
По умолчанию стоит набор из шести отвлечённых знаков — точка, крест, косой крест, рамка, кольцо и ромб. Они разложены по семи полосам, а самая светлая полоса оставлена бумагой.
load a set в панели marks берёт сразу несколько PNG, JPEG, SVG или WebP и раскладывает их по полосам в порядке файлов. Это быстрый путь от папки с рисунками до готовой лестницы.
Чтобы расставлять знаки поодиночке, бросайте файлы прямо на колонку нужной полосы в ленте или нажимайте в ней +. Несколько файлов, бро́шенных на одну колонку, целиком уйдут на эту полосу и будут на ней сменяться. Клик по фишке знака убирает его с полосы.
Чтобы работать буквами, наберите символы в поле marks, выберите шрифт и нажмите add. Каждый символ становится отдельным знаком и попадает на выбранную полосу. Полоса выбирается кликом по колонке.
Загруженный файл читается как чернила, а не как картинка: белый фон не даёт ничего, прозрачность учитывается. Скан «чёрным по белому» готовить не нужно.
Как это оживить
Из стоп-кадра с одним знаком на полосу выйдет один кадр — меняться в нём нечему. Движение появляется, когда на полосе больше одного знака.
Тогда знаки начинают сменять друг друга. hold — сколько кадров держится каждый знак, от 1 до 24; панель показывает, сколько это получается знаков в секунду при текущей частоте.
hold infinite отключает смену символов по времени, но видео и анимация сетки продолжают двигаться. Выбор знака по seed фиксируется для каждой ячейки и тонального набора; переход в другую тональную полосу или изменение сетки всё ещё может выбрать другой знак. Шаффл остаётся доступным. Настройка не сокращает секвенцию и сохраняется в проектах, ссылках и истории отмены.
В classic cycle ячейки начинают с разных знаков, но момент переключения у них общий. Для постепенного движения выберите в timing scatter / matrix. changes задаёт средний процент обновляемых ячеек за change interval в миллисекундах. Например, 10% за 250 мс: примерно столько обновлений распределится по четверти секунды в случайных местах, а не одной вспышкой. У каждой ячейки независимые часы; момент обновления заново выбирается по seed в каждом временном блоке. Полоса с одним знаком не меняется; взвешенный набор может повторно выбрать тот же знак. Процент — средняя скорость обновлений, не строгая квота на каждый кадр.
Знаки меняются напрямую, без растворения, морфинга и повторной трассировки. Повышение FPS делает смены мельче по времени, не ускоряя их. Перемотка назад, сохранение проекта, ссылка и экспорт воспроизводят ту же последовательность. hold infinite отключает оба вида перебора. У обычного scatter нет точного бесшовного цикла; длину клипа по-прежнему задаёт frames. Если было всего один кадр, включение scatter создаёт четырёхсекундный клип; выбранная ранее длина не меняется. Панель timing показывает её в секундах.
Для стоп-кадра на неподвижной сетке включите seamless loop в настройках scatter. Период равен frames / FPS. У каждой активной ячейки своё кольцо из 2–4 разных знаков, выбранных по seed из полного пригодного набора. За клип оно повторяется целое число раз. Случайный сдвиг по времени распределяет смены по циклу, в том числе на стыке последнего и первого кадров. Нет общего сброса и дублирующего конечного кадра. При редких сменах часть ячеек остаётся неподвижной: активной ячейке нужно хотя бы два обновления, чтобы уйти с первого знака и вернуться. Процент задаёт среднее число обновлений, ограниченное частотой кадров. На каждом повторе воспроизводится одно и то же кольцо; шаффл выбирает новые знаки и расписания. Для исходного видео или анимации сетки эта опция неактивна: остаётся обычный scatter, без обещания замкнуть само меняющееся изображение.
Знаки на одной полосе стоит делать вариациями одного знака: три рисунка одного и того же креста, а не три разные фигуры. Разные фигуры со случайной фазой — это телевизионный шум. Тон при смене не скачет: каждый знак пересчитывается так, чтобы давать то же покрытие, что и первый знак полосы.
Для стоп-кадра frames задаёт длину секвенции, а seamless loop ставит кратчайшую длину, на которой циклы всех полос снова сходятся.
Для видео длина берётся из клипа. frame rate постеризует время до 1–60 к/с: кадр N — это то, что исходник показывает на секунде N ÷ frame rate. Кадр держится, а не смешивается со следующим.
Halftone
halftone в шапке левой панели переключает на другой принцип — и стоит прямо сказать, насколько другой.
Режим знаков кладёт один знак в одну ячейку квадратной сетки и несёт тон размером знака. У халфтона нет ни ячеек, ни знаков. У него есть решётка центров точек с выбранной линеатурой, повёрнутая под углом, который к кадру отношения не имеет, и тон — это площадь точки. Цвет тоже не одна краска, подкрашенная по ячейкам: изображение делится на плашки, каждая растрируется под своим углом, и плашки перемножаются, как мокрая краска. Поэтому розетка и выглядит краской — повернуть сетку знаков и получить её нельзя.
Лестницы здесь нет, поэтому полосы, знаки, seed, hand и всё, что отвечает за смену знаков, пропадают. Остаётся печатный станок.
Растр
lines — линеатура: сколько линий помещается по ширине кадра, от 8 до 200. Панель сама пересчитывает — 60 линий на кадр 2048 px это точка в 34 px.
angle поворачивает весь набор растров. По умолчанию 45°, потому что под этим углом сетка точек пропадает из виду; на 0° видно ряды.
dot выбирает форму — круг, эллипс, квадрат, ромб, линия или крест. Каждая решается из одной и той же площади краски, поэтому смена формы меняет фактуру печати, а не её тон. Ради этого площадь и считается площадью, а не радиусом: квадратная и круглая точки «одного размера» расходятся на треть тона.
Цветоделение
mono — один чёрный растр. duotone — два растра в 30° друг от друга, красками на ваш выбор; вторая краска придержана в светах, поэтому пара читается как две краски, а не как одна, напечатанная дважды. cmyk — четыре плашки под 15°, 75°, 0° и 45°: классический набор, потому что два растра в 30° дают розетку, а два растра в паре градусов — муар размером со страницу.
В cmyk ручка black — это чёрная генерация. На 0 нейтрали собираются из голубой, пурпурной и жёлтой вместе: густо и плохо приводится, цветную бахрому в серых видно глазом. На 1 нейтрали несёт одна чёрная плашка, как в газете, и серые выходят чистыми.
Тон
levels работает так же, как в режиме знаков. gain гнёт тон в площадь точки: меньше 1 раскрывает тени, больше — придерживает. spread — это станок: каждая точка масштабируется перед печатью, так что больше 1 — краска растекается по бумаге, меньше 1 — растр недокормлен.
invert colour берёт негатив кадра: белые точки на чёрном и цветной негатив сведённых плашек. Размеры точек при этом не меняются.
Кадр и экспорт
frame width — та же свободная настройка от 256 до 4096 px, что и в режиме знаков; высота идёт от исходника. Точка рисуется как контур в дробной позиции, так что выравнивать не к чему. Обе стороны выходят чётными, поэтому MP4 не приходится пересчитывать кадр.
На двух и четырёх красках галочка separations кладёт в архив по папке на плашку, каждая — чёрным по белому. Это то, что заряжают в печать.
Цвет и инверсии
В режиме знаков mono печатает одними чернилами по бумаге. source colour заливает каждый знак средним цветом его собственной ячейки, так что цвет исходника сохраняется, а тон по-прежнему целиком держится на размере. (В халфтоне цвет берётся из цветоделения — см. выше.)
Инверсии две, и они делают разное:
invert colourменяет местами чернила и бумагу. Белые знаки на чёрном.invert rampразворачивает то, в какую полосу попадает тон: жирные знаки уходят на светлые ячейки, тонкие — на тёмные. Сама собранная лестница остаётся как была, переворачивается только попадание в неё.
Экспорт
png пишет ZIP: по одному PNG на кадр, и может сразу нести три прохода, каждый в своей папке:
flat— знаки по бумаге, непрозрачно.marks → alpha— только знаки, бумага прозрачная.paper → alpha— только бумага, знаки из неё вырезаны.
Вместе с invert colour это закрывает все четыре варианта. В README.txt внутри архива записаны частота кадров и либо сетка, число полос и seed, либо линеатура, угол и цветоделение.
mp4 пишет H.264 на целевой частоте. У H.264 нет альфа-канала, поэтому MP4 всегда плоский. Кадр при этом не пересчитывается по размеру.
svg пишет текущий кадр как редактируемые векторные контуры, и в каждом режиме это разная работа. В режиме знаков используются те же подготовленные контуры, что в превью, PNG и MP4, без повторной трассировки при экспорте. Все 61 127 исторических и отобранных сканов переводятся в вектор при сборке библиотеки. Введённые символы и загруженные знаки трассируются один раз при добавлении; смайлики сохраняют исходные кривые. Граница по середине плотности убирает мягкий ореол скана, но не восстанавливает потерянные в исходнике детали. PNG и MP4 сглаживают контуры в своём разрешении, а не растягивают маленькие картинки.
В файле только залитые контуры. Ничего, что нужно разрешать по ссылке, — ни общих символов, ни маски: браузер такие ссылки разворачивает, а редактор может и не развернуть, а файл, который в Illustrator или Figma открывается пустым, — это не экспорт. Плата за это в том, что каждый оттиск несёт свой собственный контур, — поэтому контуры кладутся кривыми: круглый знак остаётся круглым, а рубленый угол острым, и стоит это доли тех точек, которые понадобились бы многоугольнику на то же самое. И всё же мелкая сетка на широком кадре даёт файл примерно в мегабайт. Все оттиски одной краски приходят одним контуром — редактор получает один объект; если знаки нужны по отдельности, разберите его там.
В халфтоне не трассируется ничего. Точка и так решается из площади краски, поэтому она пишется теми самыми кривыми и многоугольниками, какими является, — файл и есть растр, и он остаётся резким на любом размере. Каждая плашка — один контур со своим именем и своей краской, поставленный на умножение, как ведут себя настоящие краски; моно — это один чёрный контур по белому. Мелкая линеатура — это много точек, так что большой кадр в cmyk даёт большой файл.
Экспорт останавливается на 900 кадрах.
Seed, проекты, клавиатура
seed управляет всеми розыгрышами по ячейкам — дрожанием hand и фазами циклов. Один и тот же seed воспроизводит работу в точности, reroll переходит к следующему. Неуправляемой случайности в инструменте нет нигде.
save сохраняет файл проекта вместе с вашими знаками. share кладёт настройки в адресную строку — загруженные знаки для ссылки слишком тяжёлые, поэтому в ссылке они подменяются штатными, о чём инструмент прямо сообщает. Если знаки важны, сохраняйте проект файлом. Знаки пресетов ссылку переживают: это имя и путь, а не картинка.
Клавиатура: пробел — старт и пауза, стрелки — шаг по кадрам, зажатый \ показывает исходник, ⌘Z и ⇧⌘Z — отмена и возврат.