Jak przekształcić plik tekstowy w obraz


17

Jeśli mam zwykły plik tekstowy, jak mogę przekonwertować go na plik obrazu za pomocą wiersza polecenia? (i zachowaj w nim układ grafiki ASCII)


Zaczynam szukać automatycznego sposobu renderowania tekstu czcionką o stałej
szerokości

To brzydkie rozwiązanie, ale dlaczego nie zrobić cattego i zrobić zrzut ekranu?
psimon

To byłoby zbyt brzydkie, a zrzut ekranu zawierałby dodatkowe informacje, takie jak monit.
Quora Feans

Jeśli tylko szybka jest problem, spróbuj tego: clear && cat file. Ale tak, to brzydkie.
psimon

nie, to nadal pokazywałoby moją nazwę użytkownika ... I dopóki nie znajdę sposobu na wykonanie zrzutu ekranu za pomocą wiersza poleceń, nie będzie to możliwe.
Quora Feans

Odpowiedzi:


8

Możesz do tego użyć openoffice (libreoffice).

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

działa również z plikami tekstowymi.


To jest niesamowite! Nie miałem pojęcia, że ​​OpenOffice może przekonwertować na JPG ... lub PNG, które właśnie próbowałem; prawdopodobnie także inne formaty. (Nie pomaga to, że w danych --helpwyjściowych nie ma wzmianki ani nawet podpowiedzi .) Zmarszczki tylko, jeśli tekst jest dłuższy niż strona, wygląda na to, że dostaniesz tylko pierwszą stronę. (Jeśli istnieje sposób, aby kazać mu wyświetlać inne strony lub wiele plików, nie jest to dla mnie od razu oczywiste. Przekazywanie --outdirnie robi różnicy.) Ale w przypadku krótkich fragmentów tekstu DZIAŁA WYJĄTKOWO dobrze, a nawet automatycznie zawija. Ładny!
FeRD

Powoduje to utworzenie strony o stałym rozmiarze z potencjalnie małym tekstem, jeśli tekst jest mały.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
@CiroSantilli page 改造 中心 法轮功 六四 page Strona o stałym rozmiarze, prawda, ale właśnie tam auto-kadrowanie ImageMagick znów się przydaje:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD

26

imagemagickjest tu twój przyjaciel. Może ci pomóc coś podobnego do: -

convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png

gdzie ascii.txtjest twój plik 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:::::::::' 
        `':::_:' -- '' -'-' `':_::::'`  
    "

z text 15,15dodanym jako pierwszy wiersz tekstu (15,15 to przesunięcie pozycyjne). Upewnij się również, że tekst do przekonwertowania jest ujęty w cudzysłów. Zrobią to pojedyncze lub podwójne cudzysłowy, ale upewnij się, że nie są one używane jako część twojej ascii-artu, ponieważ spowoduje to zamieszanie.

Wybrana czcionka powinna być czcionką o stałej szerokości, w przeciwnym razie tekst nie zostanie wyrównany.

Daje to:

wprowadź opis zdjęcia tutaj


Czy masz podpowiedź, jak uzyskać listę prawidłowych nazw czcionek? Podczas gdy Free Mono wydaje się być zainstalowany w moim systemie, imagemagick go nie rozpoznaje.
Raphael

1
@ Rafael: Możesz uzyskać listę aktualnie dostępnych czcionek z dowolnego polecenia ImageMagick (łącznie z konwersją) za pomocą -listopcji. Na przykład convert -list fontpokaże ci wszystkie możliwe argumenty -font.
FeRD

Możesz także zainstalować ten program za pomocą sudo yum install ImageMagick.
rangsiman

@ R.Ketkaew To polecenie jest ważne dla kogoś, kto ma Fedorę 21 lub nowszą, lub niektóre wersje RHEL (nawet nie jestem pewien, czy najnowszy nadal używa yum). W Fedorze 22+ polecenie instalacji jest sudo dnf install ImageMagick, a w większości popularnych dystrybucji Linuksa będzie to sudo apt-get install ...polecenie. Niezależnie od tego powyższe informacje rzeczywiście zakładają, że ImageMagick jest zainstalowany w danym systemie.
FeRD

18

Uważam, że -annotateoperator ImageMagick jest nieco wygodniejszy niż -drawsugerowała metoda garethTheRed, z tego prostego powodu, że nie wymaga on modyfikacji pliku wejściowego. Nie jest tak potężny jak -draw, ale do hurtowego zrzucania zawartości pliku tekstowego do obrazu służy dobrze.

convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" image.png

wyświetli renderowaną wersję podanej zawartości pliku, ale bez konieczności modyfikowania pliku „ascii.txt” tak, aby zawierał text 15x15część operacji -drawpodstawowej.

Określanie argumentów

Argumentem -fontmoże być dowolna obsługiwana nazwa czcionki, jeśli FreeMono nie jest dostępne (lub po prostu nie jest pożądane). Listę czcionek dostępnych dla dowolnego polecenia ImageMagick można uzyskać za pomocą -listoperatora, więc convert -list fontwyświetli wszystkie możliwe argumenty -font.

Argumenty -annotate(jak daleko przesunąć renderowany tekst od krawędzi obszaru roboczego) składają się z poziomych i pionowych przesunięć pikseli (odpowiednio). Pierwsze przesunięcie (przesunięcie x w poziomie) może być dowolną liczbą całkowitą dodatnią, ale nie musi być większe niż kilka pikseli. Drugie przesunięcie (przesunięcie pionowe w pionie) musi być co najmniej równe rozmiarowi punktowemu wybranej czcionki (argument do -pointsize), ponieważ ImageMagick umieści linię bazową czcionki w danym przesunięciu. Jeśli więc nie przesuniesz czcionki o co najmniej pointsizepiksele, górna część pierwszego wiersza zostanie obcięta.

Zalecam przejście o co najmniej kilka pikseli, więc jeśli używasz -pointsize 64, powinieneś sparować to z czymś takim -annotate +15+80. (Nie ma powodu, aby zwiększać przesunięcie w poziomie przy większych rozmiarach czcionek, nie ma związku z wymiarami tekstu).

Konieczność odgadnięcia niezbędnych wymiarów obrazu wyjściowego może być również uciążliwa. Zazwyczaj po prostu wybieram nadmierne wartości, a następnie korzystam z ImageMagick -trimi automatycznie -borderprzycinam wynik. Następujące polecenie:

convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png

wyrenderuje w polu 1000 x 2000, a następnie odetnie nadmiar białej przestrzeni z wyjątkiem 10-pikselowej ramki wokół tekstu. Na +repagesamym końcu uniemożliwia utworzenie wyjściowego PNG z przesunięciem obrazu, co w przeciwnym razie spowodowałoby, że GIMP wyświetli okno dialogowe obciążenia z pytaniem, czy należy zastosować przesunięcie.

(Oczywiście, 1000 x 2000 jest nadmierny w przypadku małych plików tekstowych, a w przypadku dłuższych może być konieczne zwiększenie przynajmniej wymiaru pionowego. Łatwiej jest jednak przecenić, ponieważ jedynym kosztem jest convertzużycie nieco więcej procesora i pamięci podczas przetwarzania.)

Wstępne przetwarzanie danych wejściowych

Jeśli twój plik tekstowy nie jest już sformatowany tak, jak potrzebujesz, aby go renderować (powiedzmy, jeśli używa bardzo długich linii), być może będziesz musiał go sformatować przed przekazaniem go convert. ImageMagick nie zawinie tekstu, więc każda linia tekstu wydłuży całą długość poziomo. Na szczęście możliwe jest uruchomienie pliku za pomocą dowolnych formatatorów wiersza poleceń, a następnie potokowanie przetworzonego tekstu convertzamiast odczytu bezpośrednio z pliku:

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

Spowoduje to wyświetlenie zawartości ascii.txt24-punktowego DejaVu Sans Condensed po przetworzeniu przez fmtpolecenie, które w domyślnym trybie działania ponownie sformatuje dane wejściowe poprzez zawijanie słów do szerokości 75 kolumn. (O ile nie występują długie ciągi ciągłe dłuższe niż 75 znaków, takie jak adresy URL, w takim przypadku będą się one rozciągać).

Po fmtponownym sformatowaniu tekstu zostanie on przekazany do, convertktóry wyświetli dane fmtwyjściowe w potoku , tak jakby czytał bezpośrednio plik. (Podanie nazwy pliku -jest dość powszechnym skrótem powłoki UNIX dla „odczytu ze standardowego wejścia zamiast dowolnego nazwanego pliku dysku”, a narzędzia ImageMagick przestrzegają tej konwencji).


1
Składnik y annotateargumentu powinien być większy niż pointize, aby mieć pewność, że wszystko się pojawi: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.pnggdzie 123jest pożądany rozmiar. Możesz także użyć, convert -list fontaby dowiedzieć się, które czcionki są obsługiwane ( "FreeMono"nie jest powszechnie obsługiwane).
Alec Jacobson

1
Poprawka: convert -list fontpoprawna składnia, a nie convert -list fonts.
Sopalajo de Arrierez

1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 Hmm, dobre pytanie. W mojej instalacji IM7 nie ma żadnych ustawionych zasad, /etc/ImageMagick-7/policy.txtktóre zakłócałyby którekolwiek z tych formularzy konwersji. Czy wiesz, jakie zasady blokują konwersję i dlaczego są ustawione? (Również chwytanie za słomki: czy przypadkowo działa fmt ...formuła polecenia w potoku ? Jeśli tak, możesz po prostu zastąpić fmtcati uzyskać taki sam wynik jak @ascii.txtwersja).
FeRD 10.10.19

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Och, jeszcze jedno pytanie: Podałeś „nie powiodło się… z tuxem bez brzydkich metadanych”. Czy to oznacza, że ​​się convert powiedzie, gdy użyjesz -drawformularza @ garethTheRed i wstawisz polecenia pozycjonowania do ascii.txtpliku? Wydaje mi się, że byłoby to dość dziwne , ponieważ mam problem z wyobrażeniem sobie, jakie byłyby obawy związane z bezpieczeństwem -annotate, które nie miałyby zastosowania również -drawpodczas pracy z zawartością importowanego pliku tekstowego.
FeRD

1
Nawet nie próbowałem odpowiedzi Garetha z powodu brzydkich metadanych, ale teraz zadziałało. Moje /etc/ImageMagick-6/policy.xmlzawiera, <policy domain="path" rights="none" pattern="@*"/>więc chyba to jest to. stdin również nie działa, prawdopodobnie dlatego, że ma w nim również @-wzorzec. Dla zdesperowanych "$(cat ascii.txt)"działa, jeśli nie wysadzi długości CLI.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.