如果我有纯文本文件,如何通过命令行将其转换为图像文件?(并保留其中的ASCII艺术作品的布局)
cat
做一个截图呢?
clear && cat file
。但是,是的,这很丑。
如果我有纯文本文件,如何通过命令行将其转换为图像文件?(并保留其中的ASCII艺术作品的布局)
cat
做一个截图呢?
clear && cat file
。但是,是的,这很丑。
Answers:
您可以使用openoffice(libreoffice)来完成。
soffice --convert-to jpg "Textfile.doc"
它也适用于文本文件。
--help
输出中没有提及甚至暗示这一点。)只是皱纹,如果文本长于一页,看起来就好像只有第一页。(如果有一种方法可以告诉它输出其他页面或多个文件,这对我来说并不是立即显而易见的。传递--outdir
没有什么区别。)但是对于短文本,它的效果非常好,甚至可以自动换行。真好!
soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
imagemagick
是你的朋友在这里。类似以下内容可能会帮助您:-
convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png
ascii.txt
您的ascii艺术文件在哪里:-
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艺术的一部分,因为这会引起混乱。
您选择的字体应该是等宽字体,否则文本将无法对齐。
这将产生:-
-list
选项,您可以从任何ImageMagick命令(包括convert)获取当前可用字体的列表。因此,例如,convert -list font
它将向您显示的所有可能参数-font
。
sudo yum install ImageMagick
。
sudo dnf install ImageMagick
,在大多数其他流行的Linux发行版中,它将是一些sudo apt-get install ...
命令。无论如何,以上信息确实假定ImageMagick已安装在相关系统上。
我发现ImageMagick的-annotate
运算符比-draw
garethTheRed建议的方法要方便一些,原因很简单,因为它不需要修改输入文件。它不如强大-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不可用(或者根本不需要),则to 的参数可以是任何受支持的字体名称。可以使用-list
运算符获取任何ImageMagick命令可用的字体列表,因此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中的内容,在默认操作模式下,它将通过自动换行将其输入重新格式化为75列的宽度。(除非存在长度超过75个字符的连续长字符串(如URL),否则它们会扩展。)fmt
一旦fmt
已经格式化文本,它会被传递给convert
将然后渲染管道fmt
输出,如同其直接读取文件。(指定的文件名-
是UNIX外壳程序的相当普遍的缩写,用于“从标准输入中读取,而不是任何命名的磁盘文件中读取”,ImageMagick的工具遵循该约定。)
annotate
参数的y分量 应大于点数,以确保所有内容均出现:所需大小convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png
在哪里123
。另外,您可以convert -list font
用来找出支持哪些字体("FreeMono"
不被普遍支持)。
convert -list font
是正确的语法,不是convert -list fonts
。
/etc/ImageMagick-7/policy.txt
任何干扰这些转换形式的策略。您知道什么政策阻止转换,为什么要设定转换?(另外,在抓救命稻草:请问管道fmt ...
的指挥工作的形式,通过任何机会,如果是这样,你可以只更换?fmt
用cat
,并得到相同的结果@ascii.txt
版本。)
convert
成功,当你使用@ garethTheRed的-draw
形式,并插入定位指令到ascii.txt
文件?在我看来,如果真是如此,那将是非常奇怪的事情,因为在处理导入的文本文件的内容时,我很难想象这种安全隐患也不会-annotate
适用-draw
。
/etc/ImageMagick-6/policy.xml
内容包含<policy domain="path" rights="none" pattern="@*"/>
在内,所以我猜就是那样的。stdin也不起作用,大概是因为它也包含@-
模式。对于绝望的人,"$(cat ascii.txt)"
如果它不占用CLI的长度,则可以使用。