Gibt es ein Befehlszeilenprogramm, das ein Bild in ein ASCII-Kunstbild konvertieren kann?

Gibt es ein Befehlszeilenprogramm (für Linux), das ein Bild in ASCII-Art konvertieren und diese Ausgabe dann als Bild speichern kann, z. B. JPG oder PNG?

Um zu veranschaulichen, was ich brauche, möchte ich das Bild unten in ASCII-Kunst umwandelnGeben Sie hier die Bildbeschreibung ein

Die Ausgabe, die ich mir von einem Programm wünsche, sollte dieser ähneln, die durch Erstellen eines Screenshots der Ausgabe eines Bild-zu-ASCII-Konverters erstellt wurde (die Ausgabe war reiner Text).

Geben Sie hier die Bildbeschreibung ein

Mir ist bewusst, dass GIMP ein Bild als ASCII-Grafik speichern kann und dass Aview ein Bild auch in ASCII konvertieren kann. Ersteres kann jedoch nicht über die Befehlszeile ausgeführt werden, und mit letzterem können Sie die Ausgabe nur anzeigen, nicht speichern (ich möchte nicht auf einen Screenshot der Ausgabe zurückgreifen).

Mir ist auch bewusst, dass libcaca seine Ausgabe in einem Bild speichern kann, aber es gibt nur farbiges ASCII aus, wie unten.

Geben Sie hier die Bildbeschreibung ein

Hergestellt durch Konvertieren des Quellbildes in Graustufen und dann mit dem folgenden Befehl:

img2txt -W 70 -f tga input.jpg > output.tga

Der Grund für den Wunsch nach einem Befehlszeilenprogramm ist die Stapelverarbeitung eines Ordners voller Bilder.

Ich habe es nie versucht, aber ich weiß, dass es möglich ist, Text an convert(ImageMagick) weiterzuleiten. Wenn Sie die Ausgabe -f von img2txt auf ansi setzen (statt auf farbiges Ansi), können Sie das Ergebnis an die Konvertierung (oder andere geeignete Software) weiterleiten.
@horatio: convert scheint eine Dateieingabe zu erwarten und weigert sich, aus einer Pipe zu lesen. Wir können es trotzdem über eine temporäre Datei tun.

Antworten (6)

Falls Sie anscheinend Linux verwenden, können Sie die Anwendungen einfach zusammenfügen, um das gewünschte Ergebnis zu erzielen. Dies kann dann auch in Ihr Stapelverarbeitungsskript eingebaut werden.

Das folgende Beispiel verwendet jp2a , einen leistungsstarken JPG-zu-ASCII-Art-Konverter mit vielen Optionen, um die gewünschten Ergebnisse zu erzielen (siehe Manpage). Anschließend verarbeiten wir die resultierende ASCII-Textdatei mit convert aus der ImageMagick-Suite zu einem Bild weiter . Auch hier gibt es viele Möglichkeiten, das Ergebnis zu verfeinern. Beide Anwendungen sind wahrscheinlich in den Repositories Ihrer Distribution verfügbar.

Das folgende Beispielskript erzeugt ein ASCII-Art-Bild (das Format ist abhängig von der von uns angegebenen Erweiterung .jpgfür JPEG) aus einem eingegebenen JPEG-Bild. Die Quelle wird auf 160 Zeichenbreite bei 6 pt gerendert. Dies passt dann gerade auf die von convert vordefinierte Standardseitengröße.

#! /bin/bash
#Usage ./j2asc infile.jpg outfile.jpg

echo "converting $1 to $2"
jp2a --width=160 -i  $1 --output=tmp.txt
convert -font Courier -pointsize 6 tmp.txt $2
Dies ist wahrscheinlich der nächste, den ich meiner gewünschten Ausgabe erreiche. Vielen Dank!
Gibt es eine Möglichkeit, die Breite dann auf etwas anderes festzulegen 835px? Ich möchte die ASCII-Kunst in ein 1920x1080Hintergrundbild konvertieren, aber wenn ich die -resize 1920x1080Option übergebe, bleibt die Breite bei 835px.
@awashburn: Die Bildgröße wird durch die Zeichenzahl (Breite) und die Punktgröße bestimmt. Vergrößern Sie die Punktgröße für eine größere Ausgabe oder skalieren Sie das resultierende Bild in einem zweiten Durchlauf.
Für MacOS-Benutzer: jp2a ist auch über Homebrew verfügbar und läuft: brew install jp2a.
Ziehen Sie in einigen Fällen auch eine direkte Ausgabe in HTML in Betracht: jp2a --html --width=160 --chars="\'\"love" input.jpg --output=output.htm. Sie können Ihren bevorzugten Zeichensatz für das Rendering angeben (Sie müssen Metazeichen maskieren, wenn Sie sie verwenden möchten). Für jp2a siehe auch AUR für Arch .
Sie sollten jede Variable, die einen Dateinamen enthält, in doppelte Anführungszeichen setzen, da Ihr Skript sonst bei Dateinamen abbricht, die Shell-Metazeichen einschließlich Leerzeichen enthalten. jp2a --width=160 -i "$1"usw.
Dies sollte die akzeptierte Antwort sein.

Sie können diesen von mir erstellten Python-Code verwenden , um ASCII-Grafiken aus Standbildern und Videos zu erstellen:

https://gist.github.com/lindylex/9374326

Beispielausgabe

OriginalGeben Sie hier die Bildbeschreibung ein

ASCII-Kunstausgabe ( python ascii_movie_image_ver_1.py cat.jpg 4 10)Geben Sie hier die Bildbeschreibung ein

Links kommen und gehen, auch wenn es Ihre eigene Seite ist... könnten Sie bitte zwei Screenshots von "vorher" und "nachher" mit Ihrem Code hinzufügen?
@Ilan Ich habe ein Beispiel hinzugefügt und auf ein öffentliches Git-Repository verwiesen
Der Link des Kerns ist 404 und der Code und der Kern des Tutorials sind nicht korrekt eingerückt (gemischte Verwendung von Tabulator und Leerzeichen) und fehleranfällig (wegen dupliziertem from PIL import Imageund import Image. Und import ImageOpsanstelle von from PIL import ImageOps). Ich habe Gist erstellt , um dies zu beheben.

Sie scheinen Linux zu verwenden und kennen libcaca bereits. Es gibt eine andere Bibliothek, die genau das tut, was Sie sagen (Image to Ascii auf der Befehlszeile): Aalib .

Es gibt viele Programme, die dies tun. Dieser funktioniert sowohl unter Linux als auch unter Windows . Verwendet keine externen Bibliotheken, vollständiger Quellcode verfügbar, etc...

Soweit mir bekannt ist, kann Aalib seine Ausgabe nicht direkt in einem Bild speichern - es müsste eine Methode mit Screenshots verwendet werden, die für große Bilder nicht zuverlässig wäre. Wenn es eine Möglichkeit gibt, dies mit Aalib zu tun, könnten Sie Ihre Antwort aktualisieren? Das von dir erwähnte Programm sieht wirklich gut aus. Führt es eine Stapelkonvertierung durch und gibt es eine Befehlszeilenschnittstelle dafür?

In Node.js Knockout 2012 gab es eine Gewinnereinreichung, die einen Webcam-Video-Feed nahm und einen „ASCII-Feed“ ausspuckte:

Asciigramm

Asciigram-Seite

Asciigram ist ein "Produktivitätstool", mit dem Sie ASCII-Videos und -Bilder mit Ihrer Webcam erstellen können. Sie können auch ASCII-Bilder erstellen, indem Sie Bilder auf die Seite ziehen. [Verknüpfung]

Es ist nicht gerade eine Befehlszeile, aber vielleicht können Sie es für Ihre Bedürfnisse nachrüsten. Die Bibliothek, die sie verwenden, um das Bild in ASCII umzuwandeln, heißt Jscii .

Es gibt nur Text und keine Bilder aus. Außerdem ist es kein Kommandozeilenprogramm

Soweit mir bekannt ist, dass das Programm keine Befehlszeilenschnittstelle hat, konvertiert es Bilder in Text und dann in Bilder. Die Quelle ist verfügbar, sodass Sie sie verwenden können, um Ihr eigenes Tool zu schreiben.

Sie haben Recht, aalib gibt keine Bilder aus, aber es gibt Text aus. Sowie viele andere Programme, die auf der Kommandozeile arbeiten.

Wenn Sie Linux verwenden, gibt es ein Befehlszeilenprogramm namens asciitopgm, das ASCII-Text in eine Bitmap konvertiert. Es ist Teil des netpbm-Pakets.

Sie können also eine Kombination von Tools verwenden:

  1. aalib, um ein Bild mit Text zu zeichnen
  2. asciitopgm, um eine pgm-Bitmap mit der Textdatei zu erstellen.
  3. (optional) Verwenden Sie convert (aus dem Imagemagick-Paket), um das pgm in ein anderes gewünschtes Rasterformat zu konvertieren.

Ich denke, Sie können auf diese Weise tun, was Sie wollten.

Ich weiß, es ist etwas spät, aber ich dachte, ich poste das trotzdem, falls hier zufällig jemand reinstolpert 😅

Sie können ein CLI-Tool verwenden, das ich kürzlich erstellt habe, ascii-image-converter. Es ist auf Snap verfügbar:

sudo snap install ascii-image-converter

Oder Sie können das Repo besuchen, wenn Sie direkt die Binärdateien oder etwas anderes möchten: https://github.com/TheZoraiz/ascii-image-converter#installation

Es unterstützt derzeit die Bildformate jpeg, png, webp, bmp und tiff, sodass es mit den meisten Bildern funktioniert, auf die Sie stoßen.

Es deckt alle Ihre Anwendungsfälle ab und kann ASCII-Kunst als PNG-Bild speichern. Dieser Befehl würde das ASCII-Kunstbild drucken und im selben Verzeichnis speichern:

ascii-image-converter myImage.jpeg -s .

Es gibt eine Reihe weiterer Flags für weitere Anpassungen, einschließlich der Bereitstellung Ihres eigenen ASCII-Zeichensatzes für die Zuordnung. Sie können die Dokumentation für weitere Details lesen . Ich arbeite daran, es zu verbessern und neue Funktionen zu integrieren. Versuche es! :)