如何将文本文件转换为图片


17

如果我有纯文本文件,如何通过命令行将其转换为图像文件?(并保留其中的ASCII艺术作品的布局)


我将开始寻找一种自动方式来渲染具有等宽字体的文本(可能会使用gimp或LaTeX)
RSFalcon7 2014年

这是一个丑陋的解决方案,但是为什么不只是cat做一个截图呢?
psimon 2014年

那太丑陋了,并且屏幕截图将包含其他信息,例如提示。
Quora Feans 2014年

如果仅是提示问题,请尝试以下操作:clear && cat file。但是,是的,这很丑。
psimon 2014年

不,那仍然会显示我的用户名...除非我找到通过命令行制作屏幕截图的方法,否则它是不可接受的。
Quora Feans 2014年

Answers:


8

您可以使用openoffice(libreoffice)来完成。

soffice --convert-to jpg "Textfile.doc"

它也适用于文本文件。


太棒了!我不知道OpenOffice可以转换为JPG ...或PNG,我只是尝试过;可能还有其他格式。(这无助于在--help输出中没有提及甚至暗示这一点。)只是皱纹,如果文本长于一页,看起来就好像只有第一页。(如果有一种方法可以告诉它输出其他页面或多个文件,这对我来说并不是立即显而易见的。传递--outdir没有什么区别。)但是对于短文本,它的效果非常好,甚至可以自动换行。真好!
FeRD '18

如果文本很小,这会生成一个固定大小的页面,上面可能有很小的文本。
Ciro Santilli新疆改造中心法轮功六四事件

1
@CiroSantilli新疆改造中心法轮功六四事件,是的,只有固定尺寸的页面,但这是ImageMagick的自动裁剪功能再次派上用场的地方:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD

26

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艺术的一部分,因为这会引起混乱。

您选择的字体应该是等宽字体,否则文本将无法对齐。

这将产生:-

在此处输入图片说明


您是否有关于如何获取有效字体名称列表的提示?虽然Free Mono似乎已安装在我的系统上,但imagemagick无法识别它。
拉斐尔

1
@Raphael:使用该-list选项,您可以从任何ImageMagick命令(包括convert)获取当前可用字体的列表。因此,例如,convert -list font它将向您显示的所有可能参数-font
FeRD

您也可以使用安装该程序 sudo yum install ImageMagick
rangsiman

@ R.Ketkaew该命令对运行Fedora 21或更低版本或RHEL的某些版本的用户有效(甚至不确定最新版本是否仍在使用yum)。在Fedora 22+上,install命令是sudo dnf install ImageMagick,在大多数其他流行的Linux发行版中,它将是一些sudo apt-get install ...命令。无论如何,以上信息确实假定ImageMagick已安装在相关系统上。
FeRD

18

我发现ImageMagick的-annotate运算符比-drawgarethTheRed建议的方法要方便一些,原因很简单,因为它不需要修改输入文件。它不如强大-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.txt24点DejaVu Sans Condensed中的内容,在默认操作模式下,它将通过自动换行将其输入重新格式化为75列的宽度。(除非存在长度超过75个字符的连续长字符串(如URL),否则它们会扩展。)fmt

一旦fmt已经格式化文本,它会被传递给convert将然后渲染管道fmt输出,如同其直接读取文件。(指定的文件名-是UNIX外壳程序的相当普遍的缩写,用于“从标准输入中读取,而不是任何命名的磁盘文件中读取”,ImageMagick的工具遵循该约定。)


1
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"不被普遍支持)。
亚历克·雅各布森

1
更正:convert -list font是正确的语法,不是convert -list fonts
Sopalajo de Arrierez,

1
@CiroSantilli新疆改造中心法轮功六四事件嗯,好问题。我的IM7安装中没有设置/etc/ImageMagick-7/policy.txt任何干扰这些转换形式的策略。您知道什么政策阻止转换,为什么要设定转换?(另外,在抓救命稻草:请问管道fmt ...的指挥工作的形式,通过任何机会,如果是这样,你可以只更换?fmtcat,并得到相同的结果@ascii.txt版本。)
FERD

1
@CiroSantilli新疆改造中心法轮功六四事件哦,还有一个问题:您指定“失败,没有燕尾元数据的晚礼服”。这是否意味着convert 成功,当你使用@ garethTheRed的-draw形式,并插入定位指令到ascii.txt文件?在我看来,如果真是如此,那将是非常奇怪的事情,因为在处理导入的文本文件的内容时,我很难想象这种安全隐患也不会-annotate适用-draw
FeRD '19

1
由于元数据的丑陋,我什至没有尝试过Gareth的答案,但是现在确实可行。我的/etc/ImageMagick-6/policy.xml内容包含<policy domain="path" rights="none" pattern="@*"/>在内,所以我猜就是那样的。stdin也不起作用,大概是因为它也包含@-模式。对于绝望的人,"$(cat ascii.txt)"如果它不占用CLI的长度,则可以使用。
Ciro Santilli新疆改造中心法轮功六四事件
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.