如果我有一個純文字文件,如何透過命令列將其轉換為圖像文件? (並保留其中 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"
它也適用於文字檔案。