Ich habe eine Konsolenanwendung, die Bilder verwaltet. Jetzt brauche ich so etwas wie eine Vorschau der Bilder in der Konsolenanwendung. Gibt es eine Möglichkeit, sie in der Konsole anzuzeigen?
Hier ist ein Vergleich der aktuellen zeichenbasierten Antworten:
Eingang:
Ausgabe:
Antworten:
Ich habe weiter mit Code von @DieterMeemken gespielt. Ich habe die vertikale Auflösung halbiert und Dithering über ░▒▓ hinzugefügt. Links ist Dieter Meemken Ergebnis, rechts mein. Auf der Unterseite befindet sich das Originalbild, dessen Größe der Ausgabe entspricht. Während Malwyns Konvertierungsfunktion beeindruckend ist, werden nicht alle grauen Farben verwendet, was schade ist.
Verwendung:
BEARBEITEN
Farbabstand ist ein komplexes Thema ( hier , hier und Links auf diesen Seiten ...). Ich habe versucht, die Entfernung in YUV zu berechnen, und die Ergebnisse waren eher schlechter als in RGB. Mit Lab und DeltaE könnten sie besser sein, aber das habe ich nicht versucht. Die Entfernung in RGB scheint gut genug zu sein. Tatsächlich sind die Ergebnisse sowohl für die euklidische als auch für die Manhattan-Entfernung im RGB-Farbraum sehr ähnlich. Ich vermute, dass es einfach zu wenige Farben gibt, aus denen Sie auswählen können.
Der Rest ist nur ein Brute-Force-Vergleich der Farbe mit allen Kombinationen von Farben und Mustern (= Symbole). Ich habe das Füllverhältnis für ░▒▓█ mit 1/4, 2/4, 3/4 und 4/4 angegeben. In diesem Fall ist das dritte Symbol tatsächlich redundant zum ersten. Wenn die Verhältnisse jedoch nicht so einheitlich wären (abhängig von der Schriftart), könnten sich die Ergebnisse ändern, sodass ich sie für zukünftige Verbesserungen dort belassen habe. Die durchschnittliche Farbe des Symbols wird als gewogener Durchschnitt von foregroudColor und backgroundColor gemäß dem Füllverhältnis berechnet. Es werden lineare Farben angenommen, was auch eine große Vereinfachung darstellt. Es gibt also noch Raum für Verbesserungen.
quelle
Obwohl das Anzeigen eines Bildes in einer Konsole nicht die beabsichtigte Verwendung der Konsole ist, können Sie die Dinge sicher hacken, da das Konsolenfenster wie jedes andere Fenster nur ein Fenster ist.
Eigentlich habe ich einmal angefangen, eine Textsteuerungsbibliothek für Konsolenanwendungen mit Grafikunterstützung zu entwickeln. Ich habe das nie beendet, obwohl ich eine funktionierende Proof-of-Concept-Demo habe:
Und wenn Sie die Schriftgröße der Konsole erhalten, können Sie das Bild sehr genau platzieren.
So können Sie es machen:
So erhalten Sie die aktuelle Schriftgröße der Konsole:
Und die erforderlichen zusätzlichen WinApi-Aufrufe, -Konstanten und -Typen:
Und das Ergebnis:
[
quelle
Button
,TextBox
usw. fehlen noch. Mein Traum ist es, eine ziemlich vollständige XAML-Unterstützung mit Datenbindung und mit WPF-ähnlicher Philosophie "Alles in irgendetwas einbetten" zu schaffen. Aber ich bin sehr weit davon entfernt ... nun, in diesem Moment :)Wenn Sie ASCII 219 (█) zweimal verwenden, haben Sie so etwas wie ein Pixel (██). Jetzt sind Sie durch die Anzahl der Pixel und die Anzahl der Farben in Ihrer Konsolenanwendung eingeschränkt.
Wenn Sie die Standardeinstellungen beibehalten, haben Sie ungefähr 39 x 39 Pixel. Wenn Sie mehr möchten, können Sie die Größe Ihrer Konsole mit
Console.WindowHeight = resSize.Height + 1;
und ändernConsole.WindowWidth = resultSize.Width * 2;
Sie müssen das Seitenverhältnis des Bildes so weit wie möglich beibehalten, damit Sie in den meisten Fällen nicht 39x39 haben
Malwyn hat eine völlig unterschätzte Methode zu konvertieren
System.Drawing.Color
zuSystem.ConsoleColor
so wäre mein Ansatz
also kannst du
Beispieleingabe:
Beispielausgabe:
quelle
das hat Spaß gemacht. Danke fubo , ich habe deine Lösung ausprobiert und konnte die Auflösung der Vorschau um 4 (2x2) erhöhen.
Ich habe festgestellt, dass Sie die Hintergrundfarbe für jedes einzelne Zeichen einstellen können. Anstatt zwei ASCII 219 (█) Zeichen zu verwenden, habe ich ASCII 223 (▀) zweimal mit unterschiedlichen Vordergrund- und Hintergrundfarben verwendet. Das teilt das große Pixel (██) in 4 Subpixel wie dieses (▀▄).
In diesem Beispiel habe ich beide Bilder nebeneinander platziert, damit Sie den Unterschied leicht erkennen können:
Hier ist der Code:
Um das Beispiel auszuführen, muss sich die Bitmap "image.bmp" im selben Verzeichnis wie die ausführbare Datei befinden. Ich habe die Konsole vergrößert, die Vorschau ist immer noch 39 und kann unter geändert werden
int sMax = 39;
.Die Lösung von Taffer ist auch sehr cool. Ihr zwei habt meine Gegenstimme ...
quelle
Ich habe über Farbräume gelesen und LAB- Räume scheinen eine gute Option für Sie zu sein (siehe folgende Fragen: Finden eines genauen „Abstands“ zwischen Farben und Algorithmus, um die Ähnlichkeit von Farben zu überprüfen )
Wenn Sie die Wikipedia CIELAB- Seite zitieren , sind die Vorteile dieses Farbraums:
Um den Abstand zwischen Farben zu messen, können Sie den Delta E- Abstand verwenden.
Mit diesem können Sie besser von
Color
bis annähernConsoleColor
:Zunächst können Sie eine
CieLab
Klasse definieren , um Farben in diesem Bereich darzustellen:Es gibt zwei statische Methoden, eine zum Messen des Abstands mit Delta E (
DeltaE
) und eine zum Kombinieren von zwei Farben, die angeben, wie viel von jeder Farbe (Combine
).Und für die Transformation von
RGB
nach könnenLAB
Sie die folgende Methode verwenden (von hier aus ):Die Idee ist, Schattenzeichen wie @AntoninLejsek do ('█', '▓', '▒', '░') zu verwenden. Auf diese Weise können Sie mehr als 16 Farben erhalten, indem Sie die Konsolenfarben kombinieren (mithilfe der
Combine
Methode).Hier können wir einige Verbesserungen vornehmen, indem wir die zu verwendenden Farben vorberechnen:
Eine weitere Verbesserung könnte darin bestehen, direkt auf die Bilddaten zuzugreifen,
LockBits
anstatt sie zu verwendenGetPixel
.UPDATE : Wenn das Bild Teile mit derselben Farbe enthält, können Sie den Prozess des Zeichnens von Zeichen mit denselben Farben anstelle einzelner Zeichen erheblich beschleunigen:
Rufen Sie zum Schluss
DrawImage
so an:Ergebnis Bilder:
Die folgenden Lösungen basieren nicht auf Zeichen, sondern bieten detaillierte Bilder
Sie können mit dem Handler über jedes Fenster zeichnen , um ein
Graphics
Objekt zu erstellen . Um den Handler einer Konsolenanwendung zu erhalten, können Sie Folgendes importierenGetConsoleWindow
:Erstellen Sie dann mit dem Handler (using
Graphics.FromHwnd
) eine Grafik und zeichnen Sie das Bild mit den Methoden imGraphics
Objekt, zum Beispiel:Dies sieht gut aus, aber wenn die Größe der Konsole geändert oder ein Bildlauf durchgeführt wird, verschwindet das Bild, weil das Fenster aktualisiert wird (in Ihrem Fall ist möglicherweise die Implementierung eines Mechanismus zum Neuzeichnen des Bildes möglich).
Eine andere Lösung ist das Einbetten eines Fensters (
Form
) in die Konsolenanwendung. Dazu müssen Sie importierenSetParent
(undMoveWindow
das Fenster in der Konsole verschieben):Dann müssen Sie nur noch eine Eigenschaft erstellen
Form
undBackgroundImage
auf das gewünschte Image setzen (tun Sie dies auf einemThread
oder umTask
zu vermeiden, dass die Konsole blockiert wird):Natürlich können Sie festlegen
FormBorderStyle = FormBorderStyle.None
, dass Fensterränder ausgeblendet werden (rechtes Bild).In diesem Fall können Sie die Größe der Konsole ändern und das Bild / Fenster ist noch vorhanden.
Ein Vorteil dieses Ansatzes besteht darin, dass Sie das gewünschte Fenster jederzeit lokalisieren und das Bild jederzeit ändern können, indem Sie einfach die
BackgroundImage
Eigenschaft ändern .quelle
Es gibt keinen direkten Weg. Sie können jedoch versuchen, einen Bild-zu-ASCII-Kunst-Konverter wie diesen zu verwenden
quelle
Ja, Sie können es tun, wenn Sie die Frage ein wenig erweitern, indem Sie a öffnen
Form
in der Konsolenanwendung .So können Sie Ihre Konsolenanwendung ein Formular öffnen und ein Bild anzeigen lassen:
System.Drawing
undSystem.Windows.Forms
In diesem Beitrag erfahren Sie, wie das geht !
Jetzt brauchen Sie alles, um so etwas hinzuzufügen:
Natürlich können Sie auch eine
PictureBox
..Und Sie können verwenden
form1.Show();
, um die Konsole am Leben zu halten, während die Vorschau zeigt.Originalbeitrag: Natürlich können Sie ein Bild in einem 25x80-Fenster nicht richtig anzeigen . Selbst wenn Sie ein größeres Fenster verwenden und Grafiken blockieren, wäre dies keine Vorschau, sondern ein Durcheinander!
Update: Sieht so aus, als könnten Sie mit GDI ein Bild auf das Konsolenformular zeichnen. siehe Taffers Antwort!
quelle