Zeit-Boxen-Tool .: Konsolenbild (Deutsch (German))

Zeit-Boxen-Tool .: Konsolenbild

Saturday, 24 January 2026

//

20 minute read

Ein glyph.--basierter Terminal Renderer mit Hilfe von shape---Matching-Algorithmen Unterstützt Bilder, animierte GIFs, ,-Videos und Live-Untertitel mit mehreren Rendermodi einschließlich Braille für maximale Details

NuGet Lizenzierungsverbot GitHub veröffentlicht

Das Ziel ist nicht Pixel-Genauigkeit, es ist Überwachungsfähigkeit unter extremen Bandbreitenbeschränkungen.

Einleitung

Dies ist eins meiner "-Zeiten---Boxed -"-Werkzeuge-MSC3-Kleinprojekte, die ich als eine begrenzte Zeit Übung bauen...,-Normalerweise über ein paar Tage..-Die Idee ist es, einen Juckreiz zu zerkratzen ?,-Lernen Sie etwas Neues und Schiff etwas Nützliches, ohne sich in endloser Funktion kriechen

Dieses Projekt begann, als ich auftrat. Alex Harri-' ausgezeichnete Artikel über ASCII RenderingSeine Herangehensweise an die Formierung von -Matching und nicht einfache Helligkeit Mapping war faszinierend, und ich dachte, dass ".I bauen könnte, dass in C... Was begann als eine einfache ASCII Bildbetrachter wuchs zu einem Terminal-Grafiksystem mit mehreren Rendering-Modi,.Video-Unterstützung und sogar eine KI-Integrationsschicht.

Der vollständige Quellcode ist verfügbar auf GitHub-: Die Daten werden auf der Grundlage der in Anhang I der Verordnung (EU) Nr. 1305/2013 aufgeführten Daten und Informationen übermittelt, die von den zuständigen Behörden des betreffenden Mitgliedstaats gemäß Artikel 2 Absatz 1 Buchstabe b der vorliegenden Verordnung erstellt wurden.

Das neueste Release herunterladen GitHub veröffentlicht

NuGet-Pakete

Schnellstart

ConsoleImage ist eine einzelne CLI, die Medien in Glyphen verwandelt - driven Terminal-Video Das Punkt ist nicht exakt Pixel.

Installieren

Der einfachste Weg, um loszulegen ist es, die neueste Version Binär herunterladen von GitHub veröffentlicht und stellen Sie sicher, consoleimage ist auf Ihrer PATH.

consoleimage photo.jpg
consoleimage "https://youtu.be/dQw4w9WgXcQ" --subs whisper

Blindenmodus-Demo

Neu in den u.a. YouTube-Überschriften

ConsoleImage ist leise zu einem Full-Terminal Media Player herangewachsen..-Version fügt YouTube-Wiedergabe hinzu.MSP2e auto.MSSK3edownloaded Abhängigkeiten und Live-KI-Untertitel, die von Whisper angetrieben werden.,e alle in den gleichen Befehl eingewickelt und es funktioniert einfach..."e flow...

Zero---Setup Auto Downloads

Abhängigkeiten werden bei der ersten Verwendung heruntergezogen und lokal zwischengespeichert, so dass neue Funktionen ohne manuelle Installationen funktionieren.

-Komponente Erstes Download Trigger Speicherort -Component
Erste Video-Wiedergabe ~/.local/share/consoleimage/ffmpeg/
Erste YouTube-URL ~/.local/share/consoleimage/ytdlp/
Flüster-Laufzeit --subs whisper ~/.local/share/consoleimage/whisper/runtimes/
Flüstermodelle für die ersten Transkriptionen ~/.local/share/consoleimage/whisper/

Unter Windows-Caches live unter %LOCALAPPDATA%\consoleimage\.

Auf macOS.,-Caches leben Sie unter Ihrem Benutzer, dem lokalen App-Datenordner, typischerweise ~/Library/Application Support/consoleimage/).

Verwendung -y / --yes um alle Downloads zu bestätigen

YouTube-Wiedergabe

YouTube-URLs spielen direkt im Terminal über die gleiche Render-Pipeline wie lokale Dateien. bedeutet die gleichen Modi: Breiten und Ausgabeformate gelten unabhängig davon, ob Sie live schauen oder einen Clip speichern. haben Sie ein benutzerdefiniertes yt-- dlp install.,. ConsoleImage kann auf es zeigen.

Untertitel und Live-Transkription

Untertitel kommen aus drei Quellen - bestehende Dateien - , - YouTube-Unterschriften - oder Live-Flüstertranskription - . - Whisper läuft der hintergrund in 15-second chunks" , bleibt dem playback-, und Caches .vtt Dateien, so dass Wiederholungen sind instant. mehrere Modellgrößen – Sprachauswahl – , und gehostete Endpunkte, damit Sie Geschwindigkeit für Genauigkeit traden oder die Arbeit ausladen können

Transkription: Nur Ausgabe wird auch unterstützt., , die ConsoleImage in einen Untertitelgenerator verwandelt, der andere Werkzeuge einspeisen kann ohne Rendering von Video-.

Diashow-Modus

Zeigen Sie es auf einen Ordner und es wird eine Bild-Diashow mit Tastatursteuerungen. Voraus-.

Vom einfachen Viewer zur Terminalgrafik

Was als Wochenende Projekt begann, um Alex Harri zu implementieren' s Algorithmus wurde etwas ehrgeizigeres... die Evolution ging ungefähr so

  1. TagGrundlegende ASCII-Rendering mit Form
  2. TagFarbunterstützung und animierte GIF-Wiedergabe hinzugefügt
  3. TagImplementierter ColorBlocks-Modus für höhere Treue
  4. TagErgänzter Braille-Modus für die Auflösung von 8,x
  5. SpäterVideo-Unterstützung ,-Matrixeffekte ,-Dokumentformat ,-MCP-Server
  6. Viel späterTemporale Stabilisierung für die Bewegung – ,® Wahrnehmungsfarbausgleich

Das Scope-Kreuzchen war real, aber jede Ergänzung fühlte sich natürlich und nützlich an. Jetzt verarbeitet es Bilder..... ,... GIFs.... Videos.... und bietet sogar einen MCP-Server für die KI-Toolintegration....

Die drei Rendering-Modi

ConsoleImage bietet drei verschiedene Möglichkeiten, Bilder im Terminal zu rendern.

flowchart LR
    A[Source Image] --> B{Choose Mode}
    B --> C[ASCII]
    B --> D[ColorBlocks]
    B --> E[Braille]

    C --> F[Shape-matched characters]
    D --> G[Unicode half-blocks]
    E --> H[2×4 dot patterns]

    style A stroke:#4a9eff
    style B stroke:#ff6600
    style C stroke:#00aa00
    style D stroke:#00aa00
    style E stroke:#00aa00
-Modus Befehl Auflösung Am besten für -Modus
Braille consoleimage photo.jpg Pixel pro Zelle ENDGÜLTIG Maximales Detail
ASCII consoleimage photo.jpg -a Weitere Informationen: http:europa.eu.int/comm/index_de.htm
Farbschlösser consoleimage photo.jpg -b 2×, vertikal (, halbig -, Blöcke ), Fotos ,, hohe Treue ,

Braille ist die Standard-Verwendung -a für ASCII oder -b für ColorBlocks-.

Terminalprotokoll-Modi

Einige Terminals unterstützen Inline-Grafikprotokolle pixel-- akkurate Rendering, während die gleiche Pipeline und Tooling

Modusvergleich

Hier ist die gleiche animierte GIF in jedem Modus dargestellt.

Farbschlösser für die Farbe | |-------|---------|----------------|-------------| | ASCII | Braille | Braille Mono | Blöcke | Ausgeglichene Zeichen Ausgeprägte Buchstaben Ausgedrückte Zahlen Ausgemusterte Zahlen Ausgedehnte Zahlen Keine Farben Ausgefärbte Zahlen Unicode-Halbzahlen Ausgeblendete Zahlen

Der ASCII-Ausgang zeigt die Form, die bei der Arbeit passt. / und \Verwendete Kurven ( und )Zeichen und unterschiedliche Dichten verwenden Zeichen wie @, #, *L 347 vom 20.12.2013, S. 671. .Die monochrome Braille-Version ist kleiner als die Farbmodi bei voller Punktauflösung.

Braille-Auflösung Der Amiga Boingball

Der Auflösungsvorteil wird klar mit dem klassischen Amiga hüpfenden Ball eine Animation, die glatte Kurven und saubere Diagonalen erfordert.

Brillanz der (Monochrom, )Brille der MSC4Farbe des
Boingball Mono Boingball Braille
-Auflösung ohne Farbe -Aufauflösung mit voller Farbe MSC6-Auflosung

Beide verwenden das gleiche -2×4 dot Grid.Die monochrome Version verzichtet auf ANSI Farbcodes, die wesentlich kleinere Ausgabe erzeugen.

Monochrome Braille-Brille-:-kompakte Schnell

Für Kurzvorschaus-Sessions oder Bandbreiten--Beschränkte Umgebungen-MSC3Monochrome Braille--monoDie Farbe der Tropfen ist vollständig.

consoleimage animation.gif --mono -w 120

Die Ergebnisse sind Verkleinerte als Farbmodi unter Beibehaltung der vollen Auflösung, die Boingball-Animation oben, ?, Die monochrome Version ist 259, KB versus 863, KB für Farbe Braille, MKK4, Für Text, -, schwerem Inhalt oder Linienkunst, MSC6, Monochrom sieht oft aus besser weil es kein Farbrauschen gibt, das mit den Forminformationen konkurriert

Wie funktioniert ASCII Shape?-?

Traditionelle ASCII-Kunst verwendet Helligkeitsmapping .- , dunklere Pixel erhalten dichtere Zeichen wie @ oder #Feuerzeug Pixel erhalten spärliche wie . oder Dies funktioniert, aber ignoriert die tatsächliche Form von Zeichen

Alex Harri-'-Ansatz ist klüger analysiert die visuelle Form jedes Zeichens, dann passen Sie Bildregionen mit Charakteren mit ähnlichen Formen zusammen. / oder \Nicht gerade irgendein Zeichen ähnlicher Helligkeit.

Sobald du jeden Charakter wie eine winzige 2-Form behandelst, wird das Rendering von , nächste MS K2 nähste Suche nach Nachbarn in einem niedrigen - dimensionalen Raum.

Der Formvektor

Jedes Zeichen wird mit einem Punkt-Probenahmeraster in einem gestaffelten Muster

[0]  [1]  [2]   ← Top row (staggered vertically)
[3]  [4]  [5]   ← Bottom row

Die linken Kreise sind abgesenkt und rechte Kreise werden angehoben, um Lücken zu minimieren, während Überlappungen vermieden werden.Jeder Probenahmekreis misst die Erfassung von ".

Hier ist der ASCII-Ausgang wieder als Referenz, während wir über das Sampling Grid sprechen.

Gestalt, die in Aktion passt

// Staggered sampling positions (3x2 grid as per Harri's article)
private static readonly (float X, float Y)[] InternalSamplingPositions =
[
    (0.17f, 0.30f), // Top-left (lowered)
    (0.50f, 0.25f), // Top-center
    (0.83f, 0.20f), // Top-right (raised)
    (0.17f, 0.80f), // Bottom-left (lowered)
    (0.50f, 0.75f), // Bottom-center
    (0.83f, 0.70f)  // Bottom-right (raised)
];

Aufbau der Zeichenkarte

Wenn der Renderer initialisiert, macht er jedes ASCII-Zeichen zu einem kleinen Bild und mustert die Regionen von 6.

private void GenerateVectors(string characterSet, string? fontFamily, int cellSize)
{
    var font = GetFont(fontFamily, cellSize);

    foreach (var c in characterSet.Distinct())
    {
        var vector = RenderCharacterVector(c, font, cellSize);
        _vectors[c] = vector;
    }

    // Normalise vectors for comparable magnitudes
    NormalizeVectors();
}

Das Ergebnis ist eine Lookup-Tabelle, die jedes Zeichen auf seine Formsignatur abbildet.

Baum, der mit dem Baum zusammenpasst

Das Finden des besten Zeichens für jede Bildzelle erfordert die Suche nach dem Raum ..Eine naive lineare Suche wäre langsam ,, so dass wir eine Baum der K.-.D. für schnelle nächstgelegene --Nachbar Lookups

flowchart TD
    A[Image Cell] --> B[Sample 6 regions]
    B --> C[Create shape vector]
    C --> D[K-D tree lookup]
    D --> E[Nearest character match]

    style A stroke:#4a9eff
    style C stroke:#ff6600
    style D stroke:#00aa00
    style E stroke:#00aa00

Das Baum der K.-.D. bietet O-(-log n-MSC1-Lookups anstelle von O-(-n-), und Ergebnisse werden mit quantisierten Vektoren für noch schnellere wiederholte Lookups gecached

Kontrastvergrößerung

Raw Shape Matching kann flach aussehen.Der Algorithmus wendet zwei Arten von Kontrastverbesserungen an.

Globaler Kontrast Eine Power-Funktion, die niedrigere Werte in Richtung Null knirscht.

value = (value / max)^power × max

Richtungskontrast Externe Probennahmekreise erkennen Kanten, bei denen der Inhalt auf leeren Raum trifft.

// 10 external sampling positions for directional contrast
private static readonly (float X, float Y)[] ExternalSamplingPositions =
[
    (0.17f, -0.10f), // Above top-left
    (0.50f, -0.10f), // Above top-center
    (0.83f, -0.10f), // Above top-right
    (-0.15f, 0.30f), // Left of top-left
    (1.15f, 0.20f),  // Right of top-right
    (-0.15f, 0.80f), // Left of bottom-left
    (1.15f, 0.70f),  // Right of bottom-right
    (0.17f, 1.10f),  // Below bottom-left
    (0.50f, 1.10f),  // Below bottom-center
    (0.83f, 1.10f)   // Below bottom-right
];

Leistungsoptimierungen

Der Renderer enthält mehrere Performance-Tricks.

  • Vorberechnete Trigonometrie Suchtabellen ersetzen per .-'cell Trig mit billiger Array-Indizierung
  • SIMD Optimierung Verwendung Vector128/Vector256/Vector512 für Entfernungsberechnungen
  • Parallele Verarbeitung Mehrsprachiges Rendering für größere Bilder
  • Stack-Zuweisung Vermeidet Haufendruck für temporäre Puffer
// Pre-computed sin/cos lookup tables (major performance optimisation)
private static readonly (float Cos, float Sin)[] InnerRingAngles = PrecomputeAngles(6, 0);
private static readonly (float Cos, float Sin)[] MiddleRingAngles = PrecomputeAngles(12, MathF.PI / 12);
private static readonly (float Cos, float Sin)[] OuterRingAngles = PrecomputeAngles(18, 0);

Braille Rendering-Auflösung

Der Braille-Modus war der größte technische Sprung, der traditionelle ASCII gibt Ihnen eine ." .pixel ?" ? pro Zeichenzelle ? . ? Unicode Braille Zeichenpaket Pixel in jede Zelle und KonsoleImage behandelt diese Punkte als zeitlich nicht nur eine statische Bitmap, sondern auch eine Art Glyphe, das Ergebnis ist eine Art glyphenhaltiges --Level, bei dem Bewegung und Frame, die Stabilität des Rahmens, das wahrgenommene Detail deutlich höher machen als das Rohgitter vermuten lässt.

Der Unicode Braille Block

Braille-Zeichen, die ein Muster in einem Rasterformat kodieren

┌─────┬─────┐
│  1  │  4  │  ← Row 0
├─────┼─────┤
│  2  │  5  │  ← Row 1
├─────┼─────┤
│  3  │  6  │  ← Row 2
├─────┼─────┤
│  7  │  8  │  ← Row 3
└─────┴─────┘
  Col0  Col1

Jeder Punkt entspricht einem Bit.

// Dot bit positions in braille character
// Pattern:  1 4
//           2 5
//           3 6
//           7 8
// Listed in 2×4 scan order: 1,4,2,5,3,6,7,8.
private static readonly int[] DotBits = { 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x40, 0x80 };

Der Zeichencode ist einfach 0x2800 + (bit pattern)Eine leere Braille-Zelle ist ⠀ Ein vollständiger Block ist ⣿ (-U-+28-FF-).-

Die Braille-Pipeline

flowchart LR
    A[Source Image] --> B[Resize to W×2, H×4]
    B --> C[Grayscale conversion]
    C --> D[Otsu threshold + temporal stabilisation]
    D --> E[Atkinson dithering]
    E --> F[Build braille codes]
    F --> G[Hybrid colours + perceptual compensation]
    G --> H[Terminal output]

    style A stroke:#4a9eff
    style D stroke:#ff6600
    style E stroke:#ff6600
    style G stroke:#00aa00

Da jede Braille-Zelle ein Punktgitter kodiert, arbeitet der Renderer auf einem internen Bild, das breiter und größer als die Zielzeichenmaße ist.

Verfahren zur automatischen Thresholding

Um in Braille umzuwandeln, sind binäre Entscheidungen erforderlich.Jeder Punkt ist auf oder aus......Ein fester Schwellenwert... wie bei der Helligkeit..

Otsu-'-Verfahren findet die optimale Schwelle, indem sie die Varianz zwischen Vordergrund und Hintergrund maximiert.

  1. Erstellen Sie ein Histogramm der Pixelintensitäten
  2. Für jede mögliche Schwelle berechnen Sie die Varianz zwischen der - und der Klasse.
  3. Wählen Sie den Schwellenwert, der die Varianz maximiert

Dies passt sich automatisch jedem Bild an.Dunkle Bilder erhalten niedrige Schwellen ., .Bright Images erhalten hohe Schwellen BrailleRenderer Quelle.)

In der Praxis ist die Naive Otsu-Schwellung nicht ausreichend für Animationen.Die Implementierungsebenen zeitliche Kohärenz........:... hysteresis so dot Entscheidungen nicht Flip Frame..........-... zu -... und Wahrnehmungskompensation nach oben...... also bleibt der Output stabil in Bewegung, anstatt zwischen Frames zu flimmern.

Atkinson Dithering

Binäre Schwellenbildung erzeugt raue Kanten Enthärtung diffusiert die Quantisierungsfehler in benachbarte Pixel, wodurch die Illusion von Zwischentönen entsteht.

Wir benutzen Atkinson-Trennung Von Bill Atkinson für den ursprünglichen Macintosh entwickelt Floyd---Steinberg-Algorithmus:

        X   1   1
    1   1   1
        1

(each "1" receives 1/8 of the error)

Warum Atkinson besser für Braille arbeitet

|-Aspekt: Floyd---Steinberg-Atkinson: |--------|-----------------|----------| Fehler diffusiert |, 100%, (16/16), |, 75%, MSKS6, MSC7 Ausbreitungsmuster |Ausbreitung von Pixeln |Ausblendung von Pixel 6Ausbleichungen Ergebnis - Weichere Gradienten - Höherer Kontrast Am besten für Fotos von |.

Atkinson verwirft absichtlich die Fehlerbehebung des Fehlers, der schärfere Kanten erzeugt, die für kleine Punktmuster kritisch sind.

private static void ApplyAtkinsonDithering(Span<short> buffer, int width, int height, byte threshold)
{
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            int idx = y * width + x;
            short oldPixel = buffer[idx];
            byte newPixel = oldPixel > threshold ? (byte)255 : (byte)0;
            buffer[idx] = newPixel;

            short error = (short)(oldPixel - newPixel);
            short diffuse = (short)(error / 8);  // 1/8 of error

            // Diffuse to 6 neighbours (only 6/8 = 75% of error)
            if (x + 1 < width)
                buffer[idx + 1] += diffuse;
            if (x + 2 < width)
                buffer[idx + 2] += diffuse;
            if (y + 1 < height)
            {
                if (x > 0)
                    buffer[idx + width - 1] += diffuse;
                buffer[idx + width] += diffuse;
                if (x + 1 < width)
                    buffer[idx + width + 1] += diffuse;
            }
            if (y + 2 < height)
                buffer[idx + width * 2] += diffuse;
        }
    }
}

Hybride Farbstichprobe

Terminal-Farben stellen eine Herausforderung dar, die wir nur setzen können eine Vordergrundfarbe pro Zeichen, aber Braille steht für Verschiedene Quellpixel.

Durch die Durchschnittung aller Pixelfarben von 8 ergibt sich ein solarisiertes "-Look-Farben-Mix zu schlammigen Grautönen von MKK4, anstatt , wir nur Beispielfarben aus Pixeln, bei denen Punkte beleuchtet werden:

flowchart TD
    A[2×4 Pixel Block] --> B{Which pixels are lit?}
    B -->|Dots 1,4,7| C[Sample only those 3 pixels]
    B -->|Dots 2,3,5,6,8| D[Sample only those 5 pixels]
    C --> E[Average lit pixel colours]
    D --> E
    E --> F[Apply colour boost]
    F --> G[Set as foreground colour]

    style A stroke:#4a9eff
    style B stroke:#ff6600
    style E stroke:#00aa00
    style F stroke:#00aa00

Dadurch wird sichergestellt, dass die angezeigte Farbe dem entspricht, was der Benutzer tatsächlich sieht.

Wahrnehmungsfarbkompensation für Sparse Glyphen

Braille-Zeichen sind von Natur aus spärlich ein Zeichen mit nur . . 2-3 . Punkte beleuchtet erscheint Dimmer als ein solider Block . ohne Kompensation . , . Braille Ausgang sieht objektiv .

Um wahrgenommene Chroma anstatt zu übertreiben Farbe wiederherzustellen

Voreingestellte Erhöhungen von (-Tunable-Effekten

  • Sättigung:-+25%-(-Restores wahrgenommene Lebendigkeit
  • Helligkeit:-+15%-M(-Kompensate für spärliche Punktabdeckungen
// Apply gamma correction and boost saturation/brightness for braille
(r, g, b) = BoostBrailleColor(r, g, b, _options.Gamma);

Vergleich der Auflösung

Für eine Ausgabe eines Zeichens aus dem Zeichen :

|-Modus Effektive Pixel |------|------------------| Weitere Informationen: http:europa.eu.int/en/comm/index_de.html Farbschlösser aus |, 100 und ×, MKS4, MSC5 und MSC6 ,| , Braille , | , 200 , × , 200 ,= , -40,000 ,-| ,

Braille bietet Die Auflösung von ASCII und Die Auflösung von Farbblöcken

Braille im Aktions-:-Landschaft Detail

Die beste Demonstration der Braille-Auflösung Vorteil ist mit glatten Gradienten und feinem Detail Dieses Landschaftsfoto zeigt, wie Braille subtile klangliche Variationen einfängt, die in ASCII.: verloren gehen würden

Landschaft in Braille

An diesem Punkt stellte ich fest, dass ich nicht mehr bei " ASCII-Kunst war, sondern wiedererkennbare Bilder sah.

Beachten Sie, wie die Himmelsgradienten und Geländedetails auch bei Terminal-Auflösung sichtbar bleiben Mit Standard-ASCII-,. Diese würden blockig werden und ihre glatten Übergänge verlieren. - .. Das Punktraster bietet genügend räumliche Auflösung, dass das Auge das Muster als kontinuierliche Bilder anstatt diskrete Zeichen integriert. -..

Matrix-Modus

Es gibt auch eine -M Flagge für einen Matrix digitalen Regen Overlay-Effekt, weil warum nicht... Es Composites fallen Katakana strömt über Ihr Quellbild...

Animation und Video

Flicker---Kostenlose Wiedergabe

Animation in den Terminals ist knifflig.... naive Ansätze verursachen sichtbare Flackern.......

DECSET - Synchronisierte Ausgabe Ein Terminal-Feature, mit dem Sie einen ganzen Rahmen gleichzeitig verwenden und verhindern können, dass Sie an mehreren modernen Terminals reißen.

// Start synchronised output
Console.Write("\x1b[?2026h");

// Write entire frame
Console.Write(frameContent);

// End synchronised output
Console.Write("\x1b[?2026l");

Delta-Rendering Nur geänderte Zellen aktualisieren

public (string output, CellData[,] cells) RenderWithDelta(
    Image<Rgba32> image,
    CellData[,]? previousCells,
    int colorThreshold = 8)
{
    var cells = RenderToCells(image);
    var height = cells.GetLength(0);
    var width = cells.GetLength(1);

    // First frame or dimension change - full redraw
    if (previousCells == null)
        return (RenderCellsToString(cells), cells);

    // Delta render - only output changed cells
    var sb = new StringBuilder();

    for (var y = 0; y < height; y++)
    {
        for (var x = 0; x < width; x++)
        {
            var current = cells[y, x];
            var previous = previousCells[y, x];

            // Skip if cell hasn't changed
            if (current.IsSimilar(previous, colorThreshold))
                continue;

            // Position cursor and output
            sb.Append($"\x1b[{y + 1};{x + 1}H");
            sb.Append(current.ToAnsi());
        }
    }

    return (sb.ToString(), cells);
}

Dies reduziert in der Regel die Leistung um 70-90% für Video-Inhalte, bei denen der größte Teil des Frames statisch ist

Temporale Stabilität

Zum Verschieben von Inhalten können kleine Per---Frame-Farbänderungen schimmern..-ConsoleImage enthält einen Dejitterpass, der glättet Farbänderungen über Frames hinweg – Verbesserung der wahrgenommenen Stabilität – insbesondere in Braille- und Colour-Modi -Block

Videounterstützung

Videodateien und YouTube-URLs werden über FFmpeg und yt.-.dlp behandelt. Trimmdauern ,, , Schalter-Rendermodi , , , Untertitel hinzufügen und in GIF- oder Dokumentformate mit dem gleichen Rendering-Core , . , exportieren

Video-Wiedergabesteuerungen

-Schlüssel Aktion -
Space Anhalten anhalten andauern anhalten
Q / Esc Beenden Sie

Format des Dokuments

ConsoleImage kann gerenderte Ausgabe in self-T--integrierte Dokumente speichern, die ohne die ursprüngliche Quelle abspielen .cidz Format verwendet GZip-Kompression mit Delta-Encodierung -(-often -~7:1-versus roh JSON , und lange Videos können als NDJSON gestreamt werden so dass Frames inkrementell anstelle von gepuffert im Speicher geschrieben werden

Es gibt auch ein leichtes Spielerpaket.ConsoleImage.PlayerDie Dokumente ohne ImageSharp oder FFmpeg können wieder abspielen. was animierte CLI-Logos möglich macht, ohne starke Abhängigkeiten zu bündeln.

API-Integrationen

Es gibt eine vollständige C-API für das Rendering von Bildern, ,, GIFs, ,, Video und Dokumenten mit feinkörnigen Renderoptionen. Renderer zurück die CLI-, , so dass Sie die Algorithmen in Ihre eigenen Werkzeuge ohne re-umsetzung der Pipeline einbetten können

Spectre-.-Console Integration ist sowohl für Live-Renderings und Dokumentwiedergabe zur Verfügung, die Sie Bilder als behandeln können Renderables innerhalb von Layouts Die README- und NuGet-Paketseiten decken die API-Oberfläche im Detail ab

Readmes - Tiefentauchgänge

Wenn Sie das volle technische Detail wünschen, sind dies die kanonischen Docs.

MCP Server für die KI-Integration

ConsoleImage enthält einen MCP-Context Protocol (Model Context Protokol)), der ihn in eine visuelle Sonde verwandelt." für KI-Workflows.....Statt einfach nur als ".AI-Integration zu sein, weil es Trend ist, kann das Modell nach reduzierten Ansichten von Medien fragen und einfache Signale messen.

Weil ConsoleImage perceptually sinnvolle Vorschauen rendern kann – ein KI kann über Videoinhalte iterativ nachdenken – :.Sampling,.Vergleich von , und Verfeinerung anstatt ganze Videos blind zu verbrauchen

Konkrete KI-Aufgaben

Mit MCP-Integration eine KI-Kanone

  • Farbige Segmente findenScann Sie ein Video mit niedriger Auflösung, identifizieren Sie die lebhaftesten oder höchsten kontrastierenden Frames und exportieren Sie eine kurze GIF
  • Szenenänderungen erkennenMessen Sie Rahmen-, um - Frame-Deltaenergie zu identifizieren wichtige Momente
  • Inhalt des Interesses suchenVerwenden Sie Heuristiken, um Frames zu finden, die Menschen oder menschliche Figuren enthalten scheinen.
  • Storyboards erstellenErstellen Sie ein Kontaktblatt aus N-Schlüsselrahmen als einzelnes gerendertes Dokument

Echtes Beispiel: Dieser Artikel wird gebaut

Beim Schreiben dieses Artikels verwendete ich ConsoleImage als MCP-Tool, um gute Beispielclips zu finden.

→ extract_frames (low-res preview at various timestamps)
→ compare_render_modes (ASCII vs braille at promising scenes)
→ render_to_gif (final export of selected clips)

Hier ist eine winzige Braille-Vorschau bei den Schriftzeichen breit genug, um Komposition und Bewegung zu erkennen

⣿⣿⣿⣿⣿⣿⣿⣿⡿⢃⠌⡱⢈⠱⣈⠱⣈⠱⢈⠛⢿⠿⠟⢛⠛⢛⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⠇⡌⠒⡄⢃⢲⣾⣷⠶⡉⠤⡀⢆⠢⢉⠢⡘⢄⢂⠉⣺⣽⢿⣞⣷⣻⣞⣷⣻⣞⣷⣿
⣿⣿⣿⣿⣿⣿⣿⣿⠐⡈⢅⠢⡁⣾⣿⡏⠤⠑⡂⢅⠢⣕⢨⣔⠡⠌⣂⠱⠘⠯⠿⣾⣽⣳⠯⣝⡗⢿⣞⣿

Dies lassen Sie mich schnell scannen Inhalt, um interessante Frames zu identifizieren, anstatt alles in voller Auflösung zu rendern.

Einrichtung

Setup ist ein einzelner MCP-Servereintrag. MCP README für Details Zu den wichtigsten Werkzeugen gehören render_image, render_to_gif, extract_framesL 347 vom 20.12.2013, S. 671. compare_render_modes.

Architektur

flowchart TB
    subgraph Core["ConsoleImage.Core (NuGet)"]
        AR[AsciiRenderer]
        BR[BrailleRenderer]
        CB[ColorBlockRenderer]
        CM[CharacterMap]
        AP[AnimationPlayer]
        DOC[Document Format]
    end

    subgraph Video["ConsoleImage.Video.Core"]
        FF[FFmpegService]
        VP[VideoPlayer]
    end

    subgraph CLI["ConsoleImage CLI"]
        MAIN[Unified CLI]
    end

    subgraph MCP["ConsoleImage.Mcp"]
        TOOLS[AI Tools]
    end

    MAIN --> Core
    MAIN --> Video
    TOOLS --> Core

    style Core stroke:#4a9eff
    style Video stroke:#ff6600
    style CLI stroke:#00aa00
    style MCP stroke:#9933ff

Schlußfolgerung

Was begann als eine schnelle Implementierung von Alex Harri-'s ASCII Rendering-Algorithmus verwandelte sich in ein Terminal-Grafiksystem... Der Zeit-MSC2...Boxen Ansatz bedeutet Versand etwas Nützliches schnell.MSC3. dann iterieren, wenn Inspiration getroffen ?.?

Schlüsselkompetenzen

  • Shape-Matching schlägt Helligkeit Mapping für Charakterauswahlqualität
  • Blindenzeichen bieten überraschende Auflösung in Terminals
  • Delta-Rendering ist wichtig für eine reibungslose Videowiedergabe
  • Temporale Kohärenz - Wahrnehmungskompensation sind der Unterschied zwischen ", recognisable, " und ",watchable,",

Der Code ist public domain. GitHub.

Folgender Artikel wird vorgestellt:

Ein anderes Mal ,--Boxen-Tool ist Klarer Blick Ein schneller, kleiner Avalonia-Client, der Markdown schön ohne WebView macht

Mehr dazu in Teil -2.-

Literaturverzeichnis

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.