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

Некоторые из этих сервисов выглядят очень круто, имеются хорошие настройки. Некоторые имеют даже платные. Но ни один не имеет того, что я хотел. И бесплатно.

Недавно к одной из статей я попросил ChatGPT создать мне подобное изображение по следующему запросу:

Возьми код, который написан ниже, и создай изображение, где этот текст будет на тёмном фоне с подсветкой кода, наклонён под углом 40 градусов вверх слева направо. При этом правая часть должна исчезать в глубине, а левая быть так близко к пользователю, что должна быть слегка размазана. Угол глубины - 30 градусов. И наложи на изображение тёплый фильтр, как Рио в Инстаграме.
(ниже был код)

Визуально выглядит круто, хоть и не совсем точно соответствует описанию, но текст кода выглядит очень странно.

Этот код к работающему не имеет никакого отношения.
Этот код к работающему не имеет никакого отношения.

Мысли сделать подобный сервис закрались у меня уже очень давно, но тут я понял, что пора. Ранее за это я никак не брался, т.к. от сложного специфического JavaScript я далёк, а работа в JS с изображениями мне вряд ли когда-нибудь ещё понадобится. В общем, просто не хотелось тратить на это кучу времени. Глядя на результат, я теперь понимаю, почему некоторые сервисы берут плату за отдельные фичи

Но вот LLM-ки доросли до приемлемого уровня. Я сначала обратился к ChatGPT и после долгих разъяснений получил половинчатый результат, т.к. тот не захотел писать мне 1000 строк кода. Тот, что я получил, не работал, и визуально смотрелся так себе.

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

Ещё пара уточняющих запросов — и сервис был почти готов к продакшену. Но по пути у меня появились новые хотелки, так что я разложил файл на три, открыл VS Code, и продолжил использовать Claude через Copilot. Так увлёкся, что даже в какое-то ограничение упёрся.

Сейчас он готов и я сначала покажу результат, наиболее близкий к предыдущему. Конечно, он не совсем такой. Нужно больше тем, больше фильтров, двойное размытие, добавить источник света, что звучит слишком много в придачу ко всем уже имеющимся настройкам.

Полностью сделано в моём сервисе без каких-либо дополнительных изменений
Полностью сделано в моём сервисе без каких-либо дополнительных изменений

Но то, что получилось, уже выглядит на мой взгляд довольно круто. С возможностями, которые я не видел нигде ранее. А если присмотритесь, то увидите ещё одно важное дополнение: выделенный текст тоже рендерится и для него можно задать цвет.

Попробовать можно тут: https://mansiper.github.io/CodeShot/
Код проекта: https://github.com/Mansiper/CodeShot
Всё работает прямо в браузере.

Какие возможности реализованы:

  • Поддерживается не только код, но и обычный текст со стандартными шрифтами

  • Для кода выбор темы

  • Для текста выбор цветов фона и шрифта, настройка выравнивания

  • Размер шрифта и высота строки

  • Настройки фона

  • Настройки отступов

  • Цвет и прозрачность выделенного текста

  • Приближение

  • Скруглённые углы

  • Стиль окна

  • Номера строк

  • Настройка тени

  • Прозрачность окна

  • Готовые фильтры (подобно фильтрам в Инсте) с заданием интенсивности

  • Поворот окна

  • Наклон окна в глубину по вертикали и горизонтали

  • Сужение каждой из сторон окна

  • Размытие с выбором направления и интенсивности

  • Все изменения сохраняются в local storage


Оставляйте ваши пожелания. По ходу дела буду добавлять новые фичи.

Это мой первый завайбкоженный проект. Без LLM я вряд ли бы за него взялся. Код в файлах не для чтения программистами, так что я его и не пытался форматировать.

И покажите в комментариях, что у вас получилось сделать в моём сервисе.

(тут могла быть реклама моего Телеграм-канала)