ECHO/printf使用零库或零头以5 LoC格式写入图像netpbm

2020-11-05 20:15:24

TL;DR:使用Netpbm文件格式,只使用基于文本的IO输出像素是微不足道的。

为了表明我什么都没有,下面是一张图片:

#!/bin/bashexec>;my_Image.ppm#所有ECHO语句都将在此处写入ECHO";P3 250 250 255";#Magic,Width,Height,Max Component Value for((y=0;y<;250;y++)){for((x=0;x<;250;x++)){ECHO";$((x^y))$((x^y)$((x|y))。

就这样。这就是生成可被GIMP、ImageMagick和Netpbm等常用工具读取的图像所需的全部内容。

为了倒回片刻,有时输出图像以进行2D算法的打印调试、可视化数据,或者仅仅是因为您有一些想要放在屏幕上的过程性像素,这是很有用的。

然而--至少如果你没有看过上面的例子--开始输出图形的门槛可能看起来相当高。即使只有一个文件库,这也是需要设置和解决的另一件事。这在调试期间尤其烦人,因为您知道要在一小时内将其删除。

幸运的是,Netpbm工具套件开发了一个非常灵活的解决方案:一组用于全色便携式PixMaps(PPM)、便携式灰度地图(PGM)和单色便携式位图(PBM)的最低公分母文件格式,它们都可以使用任何语言的基本文本IO编写为纯ASCII文本。

上面的bash脚本已经足够入门了,但是可以在安装了Netpbm的系统上的man ppm、man pgm和man pbm中找到文件格式的详细描述和示例。

每个手册页都描述了简单文件格式的两个版本:一个二进制文件格式和一个ASCII文件格式。两者都很容易实现,尽管ASCII代码是我的最爱,因为它非常简单,你可以在记事本上手写它们。

要将它们转换为更常见的文件格式(在GIMP中打开并导出),请使用ImageMagick Convert my_file.ppm my_file.png或NetPBM pnmtopng<;my_file.ppm>;my_file.png。

如果您希望使用这种简单的ASCII格式输入图像,NetPBM工具pnmtoPlapnm会将二进制ppm/pgm/pbm(包括Netpbm的anytopnm)转换为ASCII ppm/pgm/pbm。

如果您的目标是尝试任何类型的图像处理算法,您可以通过在stdin/stdout上读/写ppm来轻松地嵌入Netpbm出色的Unix-y工具集:

Curl http://example.com/input.png|pngtopnm|ppmbright-v+10|您的工具在此处|pnmscale 2|pnmtopng>;output.png