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