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

Вот весь генерирующий это изображение скрипт bash без зависимостей:
Это все, что нужно для генерации изображения, которое можно будет считать стандартными инструментами вроде GIMP, ImageMagick и Netpbm.
Дополню, что иногда удобно выводить изображение для отладки 2D-алгоритмов с помощью
Тем не менее если изначально не знать о примере выше, то порог для реализации вывода графики может показаться достаточно высоким. Даже если использовать библиотеку
К счастью, пакет инструментов 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
Если вы решите передать изображения, используя этот простой формат ASCII, то команда NetPBM
Если вы захотите поэкспериментировать с каким-либо алгоритмом обработки изображений, то можете легко задействовать прекрасный набор инструментов Netpbm путем чтения/записи PPM через


Вот весь генерирующий это изображение скрипт 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

mikhailian
Если кто-то вдруг решит выполнить ваш первый скрипт в командной строке, не создавая исполняемого файла, то вдруг окажется, что весь последующий вывод тоже будет перенаправлен в stdout.
Поэтому опытные авторы никогда не переопределяют stdin, stdout и stderr в своих текстах.
dlinyj
С чего вдруг должен будет пойти в stdout? Вот мой результат:


mikhailian
Ай, голова думает одно, а руки пишут то, что привыкли. "перенаправлен ?в? ? stdout" Попробуйте в вашей коммандной строке
ls
теперь сделать.dlinyj
А, уловил мысль.
спасёт отца русской демократии.
unsignedchar
Это один из способов выстрелить в ногу — скопировать и выполнить какой-то код из интернетов. Ещё можно создать исполняемый файл, но запустить его так:
Но это ведь не проблема автора скрипта?