Як перетворити текстовий файл у малюнок


17

Якщо у мене є звичайний текстовий файл, як я можу перетворити його у файл зображення через командний рядок? (і зберегти макет ASCII мистецтва в ньому)


Я б почав шукати автоматичний спосіб візуалізації тексту шрифтом
монопростору

Це некрасиве рішення, але чому б не просто catтак зробити знімок екрана?
psimon

Це було б занадто некрасиво, і скріншот містив би додаткову інформацію, наприклад, підказку.
Quora Feans

Якщо тільки підказка проблема, спробуйте наступне: clear && cat file. Але так, це некрасиво.
psimon

ні, це все одно відображатиме моє ім'я користувача ... І якщо я не знайду спосіб зробити скріншот через командний рядок, це не буде прийнятним.
Quora Feans

Відповіді:


8

Ви можете використовувати openoffice (libreoffice) для цього.

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

він працює і з текстовими файлами.


Це неймовірно! Я не мав уявлення, що OpenOffice може перетворити на JPG ... або PNG, що я тільки що спробував; ймовірно, інші формати. (Не допомагає, що про це немає жодної згадки чи навіть натяку на це--help .) Тільки зморшки, якщо текст довший сторінки, схоже, ви отримуєте лише першу сторінку. (Якщо є спосіб сказати це для виведення інших сторінок або декількох файлів, для мене це не відразу очевидно. Передача --outdirне має ніякого значення.) Але для коротких шматочків тексту він працює НАДЕЖДО добре, і навіть автоматично перегортає. Приємно!
FeRD

Це створює сторінку фіксованого розміру з потенційно крихітним текстом, якщо текст невеликий.
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-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 - це зміщення позиції). Також переконайтесь, що власне текст, який потрібно перетворити, укладений у лапки. Одиночні або подвійні лапки будуть, але переконайтеся, що вони не використовуються як частина вашого мистецтва, оскільки це буде заплутати справи.

Обраний вами шрифт повинен бути односхилим шрифтом, інакше текст не вирівняється.

Це дає:

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


Чи є у вас підказки, як отримати список дійсних імен шрифту? Хоча Free Mono, здається, встановлений у моїй системі, imagemagick не розпізнає його.
Рафаель

1
@Raphael: Ви можете отримати список доступних на даний момент шрифтів з будь-якої команди ImageMagick (включаючи конвертувати), використовуючи -listопцію. Так, наприклад convert -list font, показав би вам всі можливі аргументи -font.
FeRD

Ви також можете встановити цю програму, використовуючи sudo yum install ImageMagick.
rangsiman

@ R.Ketkaew Ця команда дійсна для тих, хто працює з Fedora 21 або новішою версією, або деяких версій RHEL (навіть не впевнений, що в останньому досі використовується yum). У Fedora 22+ команда встановлення є 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) повинен бути принаймні рівним розміру точки обраного шрифту (аргумент до -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

буде виведено у вікно розміром 1000х2000, а потім обріже зайвий пробіл, за винятком межі 10 пікселів у всьому протязі тексту. The+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.txtу 24-кратній DejaVu Sans Condensed, після того як вона буде оброблена fmtкомандою, яка в режимі роботи за замовчуванням переформатує свій введення шляхом перенесення слів на ширину 75 стовпців. (Якщо немає довгих безперервних рядків довжиною більше 75 символів, як-от URL-адреси, і в цьому випадку вони поширюватимуться.)

Після fmtтого як текст переформатується, він буде переданий, після convertчого він буде надавати конвеєрний fmtвисновок так само, як якщо б він читав файл безпосередньо. (Вказівка ​​імені файлу -є досить поширеною скороченням оболонки UNIX для "читати зі стандартного вводу замість будь-якого названого файлу диска", а інструменти ImageMagick дотримуються цієї конвенції.)


1
Компонент y annotateаргументу повинен бути більшим, ніж pointize, щоб бути впевненим, що все з'являється: 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 ...форму командної роботи, випадково Якщо це так, ви могли б просто замінити? fmtС cat, і отримати той же результат, що і @ascii.txtверсії.)
FERD

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 О, ще одне запитання: Ви вказали "не вдалося ... з підборкою без потворних метаданих". Чи означає це , що convert вдається при використанні @ garethTheRed в -drawформі і вставити команди позиціонування в ascii.txtфайл? Мені здається, це було б досить химерно, якщо це так, як мені здається, оскільки у мене виникають труднощі уявити, які проблеми щодо безпеки можуть бути з цим, -annotateщо це також не стосуватиметься під -drawчас опрацювання вмісту імпортованого текстового файлу.
FeRD

1
Я навіть не пробував відповіді Гарета через некрасиві метадані, але це все спрацювало. Мій /etc/ImageMagick-6/policy.xmlмістить, <policy domain="path" rights="none" pattern="@*"/>тому я здогадуюсь, що це один. stdin також не працює, імовірно, тому що він також має @-в ньому схему. Для відчайдуху "$(cat ascii.txt)"працює, якщо він не підірве довжину CLI.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.