如果我有一个纯文本文件,如何通过命令行将其转换为图像文件? (并保留其中 ASCII 艺术的布局)
答案1
imagemagick
是你的朋友吗?类似于以下内容可能会对您有所帮助:-
convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png
ascii.txt
你的 ascii-art 文件在哪里:-
text 15,15 " .88888888:.
88888888.88888.
.8888888888888888.
888888888888888888
88' _`88'_ `88888
88 88 88 88 88888
88_88_::_88_:88888
88:::,::,:::::8888
88`:::::::::'`8888
.88 `::::' 8:88.
8888 `8:888.
.8888' `888888.
.8888:.. .::. ...:'8888888:.
.8888.' :' `'::`88:88888
.8888 ' `.888:8888.
888:8 . 888:88888
.888:88 .: 888:88888:
8888888. :: 88:888888
`.::.888. :: .88888888
.::::::.888. :: :::`8888'.:.
::::::::::.888 ' .::::::::::::
::::::::::::.8 ' .:8::::::::::::.
.::::::::::::::. .:888:::::::::::::
:::::::::::::::88:.__..:88888:::::::::::'
`'.:::::::::::88888888888.88:::::::::'
`':::_:' -- '' -'-' `':_::::'`
"
添加text 15,15
为文本的第一行(15,15 是位置偏移量)。另外,请确保要转换的实际文本用引号引起来。单引号或双引号都可以,但请确保它们不用作您的 ascii-art 的一部分,因为它会造成混乱。
您选择的字体应该是等宽字体,否则文本将无法对齐。
这会产生:-
答案2
我发现 ImageMagick 的-annotate
运算符比 garethTheRed 建议的方法更方便-draw
,原因很简单,它不需要修改输入文件。它不像 那样强大-draw
,但对于将文本文件的内容批量转储到图像中来说,它就可以了。
convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" image.png
将输出给定文件内容的渲染版本,但无需修改“ascii.txt”文件以包含基元text 15x15
的部分-draw
。
指定参数
-font
如果 FreeMono 不可用(或者根本不需要),参数可以是任何受支持的字体名称。可以使用运算符获取任何 ImageMagick 命令可用的字体列表-list
,因此convert -list font
将显示 的所有可能参数-font
。
-annotate
(渲染文本从画布边缘移动多远)的参数分别由水平和垂直像素偏移组成。第一个偏移(水平 x 偏移)可以是任何正整数,但不必大于几个像素。第二个偏移(垂直 y 偏移)必须是至少等于所选字体的点大小( 的参数-pointsize
),因为 ImageMagick 将放置基线给定偏移处的字体。因此,如果您不将字体向下移动至少pointsize
像素,则第一行的顶部将被切断。
我建议至少增加几个像素,所以如果您正在使用,-pointsize 64
那么您应该将其与类似-annotate +15+80
. (没有理由用较大的字体大小来增加水平偏移,它与文本尺寸没有关系。)
需要猜测输出图像的必要尺寸也可能很乏味。我通常只是选择过多的值,然后利用 ImageMagick-trim
并-border
自动裁剪结果。以下命令:
convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png
将渲染成一个 1000x2000 的盒子,然后修剪掉文本周围除了 10 像素边框之外的多余空白。最后+repage
防止使用图像偏移创建输出 PNG,否则会导致 GIMP 在加载时弹出一个对话框,询问是否应该应用偏移。
(显然,1000x2000 对于小文本文件来说太大了,对于较长的文本文件,至少可能需要增加垂直尺寸。不过,高估更容易,因为唯一的成本是convert
在处理时消耗稍多的 CPU 和内存。)
预处理输入
如果您的文本文件尚未按照渲染所需的方式进行格式化(例如,如果它使用很长的行),那么您可能需要在将其传递给convert
. ImageMagick 不会自动换行文本,因此每行文本都会水平延伸其完整长度。幸运的是,可以通过您想要的任何命令行格式化程序运行文件,然后将处理后的文本通过管道传输到convert
而不是直接从文件中读取:
fmt < ascii.txt | convert -size 1000x2000 xc:white -font "DejaVu-Sans-Condensed" \
-pointsize 24 -fill black -annotate +15+30 "@-" -trim -bordercolor "#FFF" \
-border 10 +repage image.png
ascii.txt
这将渲染24 点 DejaVu Sans Condensed的内容,后它已由该fmt
命令处理,该命令在默认操作模式下将通过自动换行将其输入重新格式化为 75 列的宽度。 (除非有超过 75 个字符的长连续字符串,例如 URL,在这种情况下它们会扩展。)
一旦fmt
重新格式化文本,它将被传递到convert
渲染管道fmt
输出,就像直接读取文件一样。 (指定文件名-
是相当常见的 UNIX shell 简写,表示“从标准输入读取,而不是任何命名的磁盘文件”,ImageMagick 的工具遵循该约定。)
答案3
您可以使用 openoffice (libreoffice) 来完成此操作。
soffice --convert-to jpg "Textfile.doc"
它也适用于文本文件。