Статья

printor

printor берёт видео или картинку и печатает их. Каждый кадр загоняется в чёрно-белый порог, протаскивается по скану бумаги, сбивается с приводки и рвётся по краям. На выходе — оттенки серого, похожие на то, что напечатали, а потом отсканировали обратно.

Всё считается прямо в браузере. Файлы, которые вы открываете, остаются на вашей машине — странице вообще запрещено ходить в сеть.

Нужен WebGL2. Если холст остаётся пустым, откройте проверку браузера: там видно, чего не хватает.

Загрузка исходника

Перетащите файл на холст или нажмите на область и выберите его. printor читает MP4, MOV, WebM, PNG, JPEG и WebP. GIF открывается первым распакованным кадром.

Декодирование — забота браузера, а не printor. Если MP4 или MOV не открывается, переконвертируйте его в H.264 или выгрузите последовательность кадров из монтажки.

Превью уменьшается до 900 px по длинной стороне, чтобы перемотка не тормозила. Экспорт считается в исходном разрешении.

Частота кадров

frame rate задаёт выходную частоту, от 4 до 16 fps. Время постеризуется до неё раньше всего остального: кадр N — это то, что исходник показывает на секунде N / frame rate. Ролик в 24 fps, выгруженный на 8 fps, держит каждый взятый кадр втрое дольше и ничего не смешивает. Именно этот шаг и делает результат напечатанным, а не фильтром поверх плавного движения.

Длина последовательности для видео — его продолжительность, умноженная на частоту кадров.

Картинки

У картинки нет продолжительности, брать нечего. Вместо этого длину задаёт frames, от 1 до 240; этот ползунок появляется только для изображений. Исходник не меняется — кадры отличаются только тем, что все параметры разыгрываются заново. В панели видно, сколько это секунд при вашей частоте.

Каждый параметр — это диапазон

С этого стоит начать, прежде чем трогать ползунки.

Почти у каждого параметра две ручки, минимум и максимум, а не одно значение. Для каждого кадра printor берёт из этого диапазона число по hash(seed, frame, stage, parameter). Поставьте blur на 2–14 px — и первому кадру достанется, скажем, 3,1 px, а второму 11,8 px. Сведите ручки вместе, и параметр станет постоянным.

С текстурами то же самое. Стадия хранит не одну картинку, а набор. Выберите десять листов — каждый кадр возьмёт один из них. Чем больше выбрано, тем шире разброс; слоями они не накладываются.

Розыгрыш детерминированный. Один и тот же seed, номер кадра и настройки всегда дают одно и то же число — поэтому превью и экспорт совпадают точно.

Частота срабатывания стадии

У каждой стадии сверху есть applied on N% of frames. На 100% стадия работает на каждом кадре. На 40% — примерно на двух кадрах из пяти; выбор делается для каждого кадра и при том же seed повторяется. Так получается стадия, которая мигает: лист overlay ложится на одни кадры и пропускает другие.

По умолчанию displacement работает на 60% кадров, overlay — на 40%. halftone и paper cuts выключены совсем.

Девять стадий

Они идут в этом порядке, и порядок не меняется. Это важно: зерно кормит порог, а вырезы из бумаги ложатся уже на готовый отпечаток, а не на исходник.

  1. motion blur — направленный смаз исходного кадра. blur — длина в пикселях, angle — направление, samples — из скольких отсчётов собирается смаз. blur both directions размазывает симметрично, а не шлейфом.
  2. soft paper — скан мягкой бумаги под отпечатком. Выберите текстуры, потом задайте scale (100% — вписать в кадр), rotation, offset (сдвиг от центра как доля кадра, направление разыгрывается заново каждый кадр), opacity и режим blend — multiply, screen, overlay или softlight.
  3. grain & gain — шум и контраст, которые идут в порог. grain — то, что зернит заливку. gain — контраст: чем выше, тем меньше полутонов доживёт до следующей стадии. grain size — размер ячейки шума в пикселях, 1 значит попиксельно.
  4. torn edges — собственно порог, стадия, которая и делает отпечаток. image balance — где проходит рез; ниже значит больше краски. smoothness задаёт размер рваного волокна: мало — лохматый край, много — спокойная береговая линия. contrast — жёсткость края. roughness — насколько далеко краю разрешено уходить от настоящего контура.
  5. wiggle — увод приводки всего кадра, как криво поданный лист. shift — расстояние в пикселях, направление новое на каждом кадре; rotation — небольшой наклон в градусах.
  6. displacement — коробит кадр, используя скан плотной бумаги как карту высот. amount — максимальный сдвиг в пикселях, направление определяет наклон карты. Размещение — как у soft paper.
  7. halftone — процедурный повёрнутый растр. cell — шаг в пикселях: мелкий читается как тонкая печать, крупный как плакат. angle поворачивает растр, strength подмешивает его. По умолчанию выключено.
  8. paper cuts — рваные бумажные формы как маска: часть кадра вырезается. feather смягчает край. invert mask пробивает дыру по форме вместо того, чтобы её оставлять. По умолчанию выключено.
  9. overlay — лист плотной бумаги поверх готового отпечатка. Управление то же, что у soft paper, режим по умолчанию — screen.

Параметры, заданные в пикселях, рассчитаны на 1080p и масштабируются под текущий кадр, поэтому уменьшенное превью показывает то же зерно, что и экспорт в 4K.

Seed и переразыгрывание

Кнопка в панели вывода показывает текущий seed. Нажмите на неё или на клавишу R — он сдвинется. Все случайные величины во всей последовательности сменятся разом: настройки те же, дубль другой. Ничего выставленного руками не съедет.

Отмена и возврат работают для правок параметров (Cmd/Ctrl+Z, с Shift — вернуть). reset возвращает всё к значениям по умолчанию.

Просмотр

Удерживайте \, чтобы увидеть нетронутый исходник. Стрелки влево и вправо двигают на кадр, со Shift — на десять. Пробел запускает и останавливает видео. Воспроизведение идёт целыми выходными кадрами на заданной частоте, так что вы смотрите ровно то, что получите.

Экспорт

invert инвертирует готовый серый кадр и применяется ко всему, что вы выгружаете.

PNG sequence пишет ZIP. Можно взять любое сочетание трёх проходов:

  • grayscale — непрозрачный чёрно-белый.
  • white ink — остаётся белое, чёрное становится прозрачным.
  • black ink — остаётся чёрное, белое становится прозрачным.

Если выбрано больше одного прохода, каждый ложится в свою папку, чтобы их можно было завести отдельными слоями. README.txt внутри архива запоминает количество кадров, частоту и seed. Вместе с invert три прохода покрывают все четыре варианта краски.

MP4 кодируется в H.264 через WebCodecs браузера на заданной частоте кадров. В H.264 нет альфа-канала, поэтому MP4 всегда идёт плоским серым, а проходы по краске остаются только у PNG. Если кодировщика в браузере нет, кнопка неактивна.

Экспорт останавливается на 900 кадрах. Более длинный исходник обрежется, и панель предупредит об этом заранее.

Сохранение и ссылки

Настройки пишутся в локальное хранилище браузера прямо по ходу работы, так что инструмент открывается там же, где вы его закрыли. save .json скачивает проект, load читает его обратно. share link копирует ссылку с настройками, упакованными во фрагмент адреса, — в ней только настройки и никогда не ваши файлы.

Открыть printor →