Генерация изображений с помощью echo/printf в 5 строчках кода без библиотек и заголовков

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

tl;dr: форматы файлов Netpbm позволяют легко выводить пиксели, используя только текстовый ввод-вывод.



Вот весь генерирующий это изображение скрипт bash без зависимостей:

#!/bin/bash
exec > my_image.ppm    # Все инструкции echo будут писать в этот файл
echo "P3 250 250 255"  # формат, ширина, высота, максимальное значение цвета
for ((y=0; y<250; y++)) {
  for ((x=0; x<250; x++)) {
    echo "$((x^y)) $((x^y)) $((x|y))" # r, g, b
  }
}

Это все, что нужно для генерации изображения, которое можно будет считать стандартными инструментами вроде GIMP, ImageMagick и Netpbm.

Дополню, что иногда удобно выводить изображение для отладки 2D-алгоритмов с помощью printf, визуализации данных или просто для отображения на экране процедурных пикселей.

Тем не менее если изначально не знать о примере выше, то порог для реализации вывода графики может показаться достаточно высоким. Даже если использовать библиотеку single_file, это будет означать необходимость настройки еще одного компонента. И это особенно неприятно в случае отладки, когда знаешь, что буквально в течение часа его удалишь.

К счастью, пакет инструментов Netpbm предлагает на удивление гибкое решение: набор форматов файлов с «наименьшим общим знаменателем» для полноцветных Portable PixMaps (PPM), Portable GreyMaps (PGM) и монохромных Portable BitMaps (PBM), которые все можно записать в виде простого текста ASCII через базовый ввод-вывод любого языка.

Все вместе эти форматы известны как PNM: Portable aNyMaps.

Вышеприведенного скрипта bash вполне достаточно для начала, тем не менее подробное описание этого формата файлов можно найти в man ppm, man pgm и man pbm в системе, где установлен Netpbm.

Каждая страница руководства описывает две версии простого формата: двоичную и в кодировке ASCII. Любая из них реализуется очень легко, хотя ASCII-вариант мне нравится больше за его полнейшую простоту, которая позволяет прописывать такие файлы даже в Notepad.

Для преобразования их в более распространенные форматы нужно либо выполнить экспорт в GIMP, либо использовать команду ImageMagick convert my_file.ppm my_file.png, либо команду NetPBM pnmtopng < my_file.ppm > my_file.png.

Если вы решите передать изображения, используя этот простой формат ASCII, то команда NetPBM pnmtoplainpnm преобразует двоичный ppm/pgm/pbm (создаваемый любым инструментом, включая anytopnm из Netpbm) в ASCII ppm/pgm/pbm.

Если вы захотите поэкспериментировать с каким-либо алгоритмом обработки изображений, то можете легко задействовать прекрасный набор инструментов Netpbm путем чтения/записи PPM через stdin/stdout:

curl http://example.com/input.png | 
    pngtopnm | 
    ppmbrighten -v +10 |
    yourtoolhere |
    pnmscale 2 |
    pnmtopng > output.png

Источник: https://habr.com/ru/company/ruvds/blog/553614/


Интересные статьи

Интересные статьи

Когда вы используете Android Java API в Kotlin, к вам достаточно быстро приходит понимание, что вам не хватает некоторых фич Kotlin, которые делают написание кода намного...
В этой статье я расскажу про готовое решение для поддержки консистентности данных между растущей микросервисной и унаследованной архитектурой. Под катом код для репликации двух баз данных...
Работать с Data Science в Jupyter, конечно, очень приятно, но если вы хотите пойти дальше и развернуть свой проект или модель на облачном сервере, то здесь есть много отличных решений — с...
В статье рассказывается об опыте боевого применения обфускатора ConfuserEx 0.6.0 для защиты сервиса .Net под Windows и Mono. Дело было в далеком 2016 году, но, я думаю, тема не потеряла а...
Я — большой любитель TypeScript. По возможности я стараюсь использовать этот язык в своих проектах. TypeScript даёт разработчику отчёты об ошибках и проверку типов в JavaScript и TypeScript-коде....