Как превратить текстовый файл в рисунок

17

Если у меня есть простой текстовый файл, как я могу преобразовать его в файл изображения через командную строку? (и сохранить макет ASCII-искусства в нем)

Quora Feans
источник
Я бы начал искать автоматический способ рендеринга текста моноширинным шрифтом (возможно, gimp или LaTeX)
RSFalcon7
Это уродливое решение, но почему бы просто catне сделать снимок экрана?
псим
Это было бы слишком уродливо, и на скриншоте была бы дополнительная информация, такая как подсказка.
Quora Feans
Если только подсказка проблема, попробуйте следующее: clear && cat file. Но да, это безобразно.
псим
нет, это все равно покажет мое имя пользователя ... И если я не найду способ сделать снимок экрана через командную строку, он не будет приемлемым.
Quora Feans

Ответы:

8

Вы можете использовать openoffice (libreoffice), чтобы сделать это.

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

он работает и с текстовыми файлами.

Адмирал смит
источник
Это замечательно! Я понятия не имел, что OpenOffice может конвертировать в JPG ... или PNG, что я только что попробовал; возможно и в других форматах. (Не помогает, что нет никакого упоминания или даже намека на это в --helpвыходных данных.) Только морщина, если текст длиннее страницы, похоже, вы получаете только первую страницу. (Если есть способ заставить его выводить другие страницы или несколько файлов, для меня это не сразу очевидно. Передача --outdirне имеет значения.) Но для коротких фрагментов текста он работает ОЧЕНЬ хорошо, и даже автоматически переносится. Ницца!
февраля
Это создает страницу фиксированного размера с потенциально крошечным текстом, если текст маленький.
Сиро Сантилли 新疆 新疆 中心 法轮功 六四 事件
1
@CiroSantilli true 改造 中心 法轮功 六四 事件 Страница фиксированного размера, правда, но тут вам пригодится функция автообрезки 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-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, так как это может сбить с толку.

Выбранный шрифт должен быть моноширинным, иначе текст не будет выравниваться.

Это производит: -

введите описание изображения здесь

garethTheRed
источник
У вас есть подсказка, как получить список допустимых имен шрифтов? В то время как Free Mono, кажется, установлен в моей системе, imagemagick не распознает его.
Рафаэль
1
@Raphael: Вы можете получить список доступных на данный момент шрифтов из любой команды ImageMagick (включая команду convert), используя эту -listопцию. Так, например convert -list font, покажет вам все возможные аргументы -font.
15:37
Вы также можете установить эту программу с помощью 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

Я считаю, что -annotateоператор ImageMagick более удобен, чем -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 недоступен (или просто не нужен). Список шрифтов, доступных для любой команды ImageMagick, можно получить с помощью -listоператора, поэтому convert -list fontотобразятся все возможные аргументы для -font.

Аргументы -annotate(как далеко сдвинуть визуализированный текст от края холста) состоят из горизонтальных и вертикальных смещений пикселей (соответственно). Первое смещение (горизонтальное смещение по оси X) может быть любым положительным целым числом, но не должно превышать несколько пикселей. Второе смещение (вертикальное смещение по оси Y) должно быть, по крайней мере, равно размеру точки выбранного шрифта (аргумент to -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потреблять немного больше ресурсов процессора и памяти при обработке.)

Ввод предварительной обработки

Если ваш текстовый файл еще не отформатирован так, как вам нужно для его рендеринга (скажем, если он использует очень длинные строки), то вам, возможно, придется переформатировать его перед передачей 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 после его обработки fmtкомандой, которая в режиме работы по умолчанию переформатирует свой ввод путем переноса слов на ширину 75 столбцов. (Если нет длинных непрерывных строк длиной более 75 символов, таких как URL, в этом случае они будут расширены.)

После того fmt, как текст будет переформатирован, он будет передан в convertнего, а затем отобразит fmtвывод по конвейеру , как если бы он читал файл напрямую. (Указание имени файла -является довольно распространенным сокращением оболочки UNIX для «чтения из стандартного ввода вместо любого именованного файла на диске», и инструменты ImageMagick следуют этому соглашению.)

FERD
источник
1
Компонент y annotateаргумента должен быть больше, чем размер точки, чтобы быть уверенным, что все появляется: 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.
Сопалахо де Арриерес
1
@CiroSantilli good 改造 中心 法轮功 六四 事件 Хм, хороший вопрос. В моей установке IM7 не установлено никаких политик, /etc/ImageMagick-7/policy.txtкоторые мешали бы любой из этих форм конвертации. Знаете ли вы, какая политика блокирует конвертацию и почему она установлена? (Кроме того, цепляясь за соломинку: работает ли fmt ...по какой-либо fmtcat@ascii.txt
причине
1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 О, еще один вопрос: вы указали «не удалось ... с смокингом без уродливых метаданных». Означает ли это, что convert успешно, когда вы используете -drawформу @ garethTheRed и вставляете команды позиционирования в ascii.txtфайл? Мне кажется, было бы довольно странно, если бы это было так, поскольку у меня возникли проблемы с представлением, какие проблемы безопасности могут возникнуть -annotate, если это не относится к -drawработе при работе с содержимым импортированного текстового файла.
FERD
1
Я даже не пробовал ответить Гарету из-за уродливых метаданных, но теперь это сработало. Мой /etc/ImageMagick-6/policy.xmlсодержит, <policy domain="path" rights="none" pattern="@*"/>так что я предполагаю, что это тот. stdin также не работает, предположительно потому, что в нем также есть @-шаблон. Для отчаявшихся, "$(cat ascii.txt)"работает, если не взорвать длину CLI.
Сиро Сантилли 新疆 19 中心 法轮功 六四 事件