Back to "Outil encadré de temps: ConsoleImage"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

.NET ASCII Art Tools

Outil encadré de temps: ConsoleImage

Saturday, 24 January 2026

Un référentiel terminal fondé sur un glyph- utilisant la forme - algorithmes de parallèle. Soutien aux imagesM SK3 GIF animésMSC4 vidéosMNK5 playback YouTubeMRK6 et sous-titres en direct avec plusieurs modes de référence incluant le braille pour obtenir des détails maximaux

NuGet Licence: Non-licence Publications de GitHub

L’objectif n’est pas l’exactitude des pixels; mais la surveillance sous des contraintes extrêmes de largeur de bandeM SK1

Introduction

C’est l’un de mes "temps -outils boxed". Les petits projets que je réalise en tant qu’exercice à temps limitéM SK4 généralement au cours d’une période de quelques joursMSC5 L’idée est de débrouiller un œil de souffrance, de apprendre quelque chose de nouveau, de livrer quelque chose utile sans s’enfoncer dans une dérive infinie des fonctionnalités.

Ce projet particulier a commencé lorsque j'ai découvert Alex Harri's excellent article sur la traduction ASCII. L'approche qu'il a adoptée en matière de forme - était fascinante, c'est-à-dire l'appariement plutôt que la simple cartographie de la luminosité.

Le code source complet est disponible sur GitHub: https://githubMSC1comM SK2scottgal/mostlylucidMST4consoleimage

Télécharger la dernière version: Publications de GitHub

NuGet Packages:

Démarrage rapide

ConsoleImage est un CLI unique qui transforme les médias en glyph-video terminal pilotéM SK1 Le point n'est pas exact pixels; ilMSC3la visibilité sous des contraintes brutalesMNK4

Installer

La façon la plus facile de commencer est de télécharger la dernière version du fichier binaire de Publications de GitHub et veiller à ce que consoleimage est sur votre PATH.

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

Démonstration du mode Braille

Nouvelles dans v4.0: YouTube + Sous-titres en direct

ConsoleImage s'est transformée silencieusement en un lecteur de médias terminaux complet. Version 4.0 ajoute le playback YouTube, autoM SK3 dépendances téléchargéesMSC4 et sous-titres AI vivants animés par WhisperMNK5 tous revêtus dans la même MRK6une commande et cela fonctionne simplementMST7 fluxMstK8

Zero-Setup téléchargements automatiques

Les dépendances sont retirées lors de la première utilisation et cachées localement, afin que les nouvelles fonctionnalités fonctionnent sans installation manuelle:

Component Premier déclencheur de téléchargement
FFmpeg ~/.local/share/consoleimage/ffmpeg/
ytM SK1dlp Premier URL de YouTube ~/.local/share/consoleimage/ytdlp/
Whisper Runtime Première --subs whisper ~/.local/share/consoleimage/whisper/runtimes/
Modèles de murmurer Première transcription ~/.local/share/consoleimage/whisper/

Sur Windows, les caches vivent sous %LOCALAPPDATA%\consoleimage\.

Sur macOS, les caches vivent sous votre utilisateur - dossier de données d'application locale (habituellement ~/Library/Application Support/consoleimage/).

Utilisation -y / --yes à auto-confirmer tous les téléchargements.

Retour sur YouTube

Les URL de YouTube sont diffusées directement dans le terminal par l'intermédiaire d'yt-dlp, et elles se déroulent sur la même pipeline que les fichiers locaux. signifie que les mêmes modes, largeurs , et formats de sortie s’appliquent, que vous regardez en direct ou que vous sauvegardez un clip avoir un yt personnalisé-dlp install, ConsoleImage peut l'apercevoir

Subtitles et Transcription en direct

Les sous-titres proviennent de trois sources : l'arrière-plan dans 15- chunks de secondes , demeure avant le playback, et les caches .vtt les fichiers de sorte que la reproduction est instantanée. Il supporte tailles de modèles multiples, sélection linguistique , et points finals hébergés afin que vous puissiez échanger la vitesse pour l'exactitude ou décharger le travail.

Transcription-seule la sortie est également supportée, qui transforme ConsoleImage en un générateur de sous-titres pouvant alimenter d'autres outils sans produire de vidéo.

Mode de présentation des diapositives

Pointez-le sur un dossier et il devient une diapositive d'image avec les commandes de clavier, shuffle optionnelM SK1 et manuel ou ajusté Avantages.

De l'écran simple à la graphique terminale

Ce qui a commencé comme un projet de fin de semaine pour mettre en œuvre l’algorithme d’Alex Harri, ', est devenu quelque chose plus ambitieux.

  1. Journée 1: Rendement ASCII de base à l'aide d'une forme
  2. Journée 2: Ajout d'un support de couleur et une reproduction animée du GIF
  3. Journée 3: Mode ColorBlocks mis en œuvre pour une plus grande fidélité
  4. Journée 4: Modèle de braille ajouté pour 8x résolution
  5. Plus tard: Soutien vidéo , Effets matrices M SK2 Format de document , Serveur MCP
  6. Beaucoup plus tard: Stabilisation temporelle pour le mouvement , compensation visuelle de la couleur

L’extrémité de la portée était réelle, mais chaque ajout s’est avéré naturel et utile . Maintenant, il gère les images, GIFsM SK3 vidéosMSC4 et même fournit un serveur MCP pour l’intégration d’outils AIMNK5

Les trois modes de traduction

ConsoleImage offre trois façons distinctes de rendre des images dans le terminal:

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
Mode Modèle Commande MSC2 Résolution SMC3 Le meilleur pour SMC4
Braille consoleimage photo.jpg 8× pixels par cellule (2×4 dots) DÉFAULT - Détail maximal
ASCII consoleimage photo.jpg -a Compatibilité la plus large
Les blocs de couleurs consoleimage photo.jpg -b 2× verticale MSC2 demi-blocs MSC3 blocs SMC4 SMC5 Photos ESC6 haute fidélité ESC7

Le braille est par défaut. Utilisation -a pour ASCII ou -b pour ColorBlocks.

Modes du protocole terminal

Certains terminaux appuient les protocoles graphiques en ligne. pixel-référence exacte tout en gardant la même ligne de conduite et les mêmes outils

Comparaison du mode

Voici le même GIF animé rendu dans chaque mode:

ASCII Braille MSC2 Brail MSC3MonoMSc4 USC5 ColorBlocks USC6
ASCII Braille Braille Mono Les blocs
FormeM SK1 caractères correspondants 2×4 patrons de dots compacts , sans couleur SSK6 demi-Unicode SNK7 blocs SNK8

La sortie ASCII montre la forme-matching at work - diagonal edges use / et \Utilisation des courbes , ( et ), et différentes densités utilisent des caractères comme @, #, *, et .. La version en braille monochrome est plus petite que les modes de couleur, tout en conservant la résolution complète des dots.

Résolution en braille: The Amiga Boingball

L’avantage de résolution devient évident avec la balle bouncing classique Amiga - une animation qui exige des courbes douces et des diagonales propresM SK1

Braille (Monochrome) Brail SMK4CouleurMSC5
Boingball Mono Boingball Braille
8× résolutionM SK2 couleur non indiquée MSC3 4 résolutionMSc5 couleur complète MSC6

Les deux utilisent la même grille de points 2×4 (8 pixels par cellule de caractères). La version monochrome omet complètement les codes de couleur ANSIMSC3 produisant une output beaucoup plus petiteM SK4

Braille monochrome: Compact & Fast

Pour un aperçu rapide, Sessions SSH , ou largeur de bandeM SK2environnements restreints, braille monochrome MSC4--mono) chute complètement de couleur

consoleimage animation.gif --mono -w 120

Les résultats sont les suivants : 3-5x plus petit que les modes de couleur tout en conservant la pleine résolution. Cette animation de boingball ci-dessus? La version monochrome est M SK2 KB contre 863 KB pour le braille de couleurMSC4 Pour le texteMska5 Contenu lourd ou art linéaireM Ska6 la monographie semble souvent améliorer car il n’y a pas de bruit de couleur concurrentiel avec l’information sur la forme.

Comment fonctionne la forme ASCII-Matching

L'art traditionnel ASCII utilise la cartographie de la luminosité - les pixels plus foncés reçoivent des caractères plus denses comme @ ou #, les pixels plus légers obtiennent des pixels peu nombreux comme . ou . Cela fonctionne, mais ignore la valeur réelle de la forme de caractères.

Alex Harri' l’approche est plus intelligente : analyser la forme visuelle de chaque caractère M SK2 puis correspondre les régions d’image aux caractères ayant des formes similaires . Une ligne diagonale devrait être mapped pour / ou \, non seulement tout caractère de luminosité similaireM SK1

Une fois que vous traitez chaque caractère comme une petite forme 2DM SK1, la traduction devient la plus proche de l’image -la recherche voisine dans un espace à faibles dimensions

Le vecteur de la forme

Chaque caractère est analysé à l’aide d’un Réseau d'échantillonnage à points 6- dans un modèle 3×2 staggered

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

Les cercles gauches sont abaissés et les cercles droites soulevés pour réduire au minimum les lacunes tout en évitant le chevauchement. Chaque cercle d'échantillonnage mesure M SK1infiltration de l'ink" à cette positionMSC3 créant un vecteur de forme 6-dimensionnelle

Voici encore une fois la sortie ASCII de ', alors que nous parlons du grille d’échantillonnage.

Conformité de la forme en action

// 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)
];

Établissement de la carte du caractère

Lorsque le renderer initialise, il rend chaque caractère ASCII à une petite image et échantillonne les régions 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();
}

Le résultat est une table de recherche qui cartographie chaque caractère à sa signature de forme.

K-D Correspondance des arbres

Pour trouver le meilleur caractère pour chaque cellule d'image, il faut effectuer une recherche 6-espace dimensionnelM SK1 Une recherche linéaire naïve serait lente, donc nous utilisons un L’arbre K-D pour la recherche la plus proche-neighbour 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

L'article 5 de la Loi sur l'immigration et le statut des réfugiés L’arbre K-D fournit des recherches O(log nM SK1 au lieu d’O(nMSC3 et les résultats sont cachés à l’aide de vecteurs quantifiés pour une recherche encore plus rapide et répétée.

Amélioration du contraste

Le parallèle de forme brute peut apparaître plat. L'algorithme applique deux types d'amélioration du contraste:

Contrast mondial - Une fonction de puissance qui réduit les valeurs à zéro

value = (value / max)^power × max

Contrast directif Les cercles d’échantillonnage externes détectent les bordures où le contenu rencontre l’espace vide:

// 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
];

Optimisations du rendement

Le rédacteur comprend plusieurs trucs de performance:

  • Pré-trigonométrie calculée - Les tableaux de recherche remplacent le trig cellulaire par un index d'arrérage bon marché.
  • Optimisation du SIMD - Utilisations Vector128/Vector256/Vector512 pour les calculs de distance
  • Traitement parallèle - Multi-référence en ligne pour des images plus grandes
  • Répartition des stocks - Évite la pression de masse pour les tampons temporaires
// 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);

Rendement en braille: M SK1x Résolution

Le mode de braille a été le plus grand pas technique. L’ASCII traditionnel vous donne un "pixel" par cellule de caractèresM SK3 paquet de caractère du braille Unicode 8 pixels dans chaque cellule, et ConsoleImage traite ces points comme un chronologique signal, non pas seulement une carte bitmap statiqueM SK1 Le résultat est un type de glyph-niveau MSC3superrésolution " où le mouvement et la stabilité entre les cadres(-~-) rendent le détail perçu nettement plus élevé que ce qu'indiquerait la grille brute.

Le bloc de Braille Unicode

Les caractères en braille (UM SK1 - U+28FFMSC4 codent un patron de points SSK5 dans une grille 2×4

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

Chaque point correspond à un 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 };

Le code de caractères est simplement 0x2800 + (bit pattern). Une cellule de braille vide est ⠀ (UM SK1 un bloc complet est ⣿ (UM SK1FF ).

Le pipeline de Braille

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

Étant donné que chaque cellule de braille encode une grille de points 2×4 ,, le rédacteur opère sur une image interne plus large et plus haute que les dimensions des caractères cibles.

Otsu's Méthode

La conversion au braille exige des décisions binaires - chaque point est en marche ou hors de marcheM SK1 Un seuil fixe ( similaire à

Méthode Otsu's recherche le seuil optimal en maximisant la variance entre l'avant-plan et l'arrière-plan. L'algorithme

  1. Établir un histogramme des intensités pixels (256 binsM SK1
  2. Pour chaque seuil possible (0-255), calculer la variance entre les classes -
  3. Choisissez le seuil qui maximise la variance

Cela s’adapte automatiquement à n’importe quelle image - les images foncées obtiennent des seuils faibles , les photos lumineuses obtenant des seuil élevés Source BrailleRenderer.)

Dans la pratique, le seuil naïve Otsu est insuffisant pour l'animation . Les couches de mise en œuvre cohérence temporelle M SK2think: hysterèse de sorte que les décisions relatives aux dots ne tournent pas du cadreMNK4àMMK5frameMRK6 et une compensation perceptuelle au-dessus de celui-ci MNK7 c'est pourquoi la sortie demeure stable dans le mouvement plutôt qu'un flicker entre les cadresMZK8

Atkinson Dithering

Le seuil binaire crée des bords durs. Dithering diffuse l'erreur de quantisation vers les pixels voisins, créant l'illusion des tones intermédiaires .

Nous utilisons Dithering d'Atkinson (développé par Bill Atkinson pour le Macintosh original) au lieu du plus commun Algorithme Floyd-Steinberg:

        X   1   1
    1   1   1
        1

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

Pourquoi Atkinson fonctionne mieux pour le braille:

Aspect FloydM SK2Steinberg MSC3 Atkinson MSC4
L'erreur a été disséminée.
Modèle de diffusion 4 pixels
Résultat
Suivant le mieux pour Photos MSC2 Art de ligneMSc3 texte MSC4

Atkinson rejette délibérément 25% de l’erreur , produisant des bords plus étroits - critique pour les petits patrons de dots.

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;
        }
    }
}

Échantillonnage hybride de couleur

Les couleurs terminales représentent un défi: nous ne pouvons que fixer une couleur avant-plan par caractère, mais le braille représente 8 pixels de source différents.

En comparant toutes les couleurs 8 pixels, on obtient une apparence "solarisée" seulement des couleurs échantillonnées à partir de pixels où les points sont éclairés:

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

Cela garantit que la couleur affichée correspond à ce que l'utilisateur voit réellement - les points éclairés.

Rémunération par couleur perceptuelle pour les glaces en remplacement

Les caractères en braille sont intrinsèquement épineux - un caractère dont les points sont lits seulement 2-3 apparaît plus foncé qu'un bloc solideM SK2 Sans compensation, la sortie de braille semble objective " corrigéeMSC5 mais visuellement affaiblieMNK6

Rétablir le chrome perçu plutôt que d'exager la couleur:

Boosts par défaut (tunable):

  • Saturation: +25% ≥(rétablit la perception de la vitalité
  • Éclaircissement: +15% ≥(compensations pour la couverture des points épineuxM SK3
// Apply gamma correction and boost saturation/brightness for braille
(r, g, b) = BoostBrailleColor(r, g, b, _options.Gamma);

Comparaison de la résolution

Pour une sortie de caractères 100×50

Modèle Mode Pixels efficaces
ASCII 100 3 4 5 6 7
ColorBlocks 100 3 4 5 6
Braille

Le braille fournit 8x la résolution de l'ASCII et 4x la résolution de blocs de couleur.

Braille en action: Détail du paysage

La meilleure démonstration de la résolution du braille' est avec des gradients lisses et un grand détail.

Landscape en braille

À ce moment-là, je me suis rendu compte que je ne regardais plus l’art ASCII de "ASCII de " mais des images reconnaissables.

Notez comment les gradients du ciel et les détails du terrain demeurent visibles même à la résolution terminale. Avec l’ASCII standardMSC1 ils deviendraient bloqués et perdent leurs transitions lisses . La grille de points 2×4 fournit une résolution spatiale suffisante pour que l’œil intègre le modèle en image continue plutôt qu’en caractères discrètsM SK4

Mode de matrice

Il y a également un -M flag for a Matrix digital rain overlay effect, because why notMSC1 It composites falling katakana streams over your source imageM SK2 Silly, but funMST4

Animation et vidéo

Flicker-Playback gratuit

L'animation dans les terminaux est compliquée - des approches naïves provoquent un éclair visibleM SK1 ConsoleImage utilise plusieurs techniques:

DECSET 2026 Output synchronisé - une fonction terminale qui vous permet de "commettre" un cadre entier à la foisM SK3 prévenir les ruptures

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

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

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

Rendement de Delta - Seulement les mises à jour des cellules modifiéesM SK1

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);
}

Cette méthode réduit habituellement la production par 70-90% pour le contenu vidéo où la plupart du cadre est statique.

Stabilité temporelle (Dejitter)

Pour déplacer le contenu, petits parM SK1 les changements de couleur du cadre peuvent s'éclairer . ConsoleImage comprend un déjitter qui glémente Changements de couleur à travers les cadres, amélioration de la stabilité perçueM SK1 particulièrement en braille et en couleur - modes d'interruption.

Soutien vidéo

Les fichiers vidéo et les adresses URL de YouTube sont gérés par FFmpeg et yt-dlp (autoM SK2downloaded on first use). You can start at offsetsMSC4 durées de traçage, modes de référence des interrupteurs, ajout de sous-titres , et exportation à un format GIF ou document en utilisant le même noyau référentiel

Contrôles de reproduction vidéo:

Mot clé Mesure
Space Pause
Q / Esc Quitter

Format du document

ConsoleImage peut sauvegarder l'extrait rendu à des documents contenant lui-même- qui se reproduisent sans la source originale. .cidz le format utilise la compression GZip avec l'encodage delta (ou fréquemment ~7:1 comparativement à JSON bruteM SK2 et les longs vidéos peuvent être transmis sous forme de NDJSON de sorte que les cadres sont écrits graduellement au lieu d'être tamponnés dans la mémoire.

Il y a aussi un paquet de joueurs légers (ConsoleImage.Player) qui peut reproduire les documents sans ImageSharp ou FFmpeg, ce qui rend les logos CLI animés faisables sans associer de lourdes dépendances.

API & Intégrations

Il y a un API complet C# pour la traduction d'images, GIFs , vidéoM SK3 et des documents avec fines options de traductionMSC4grained render optionsMST5 La même Rendeurs retournent le CLI, pour que vous puissiez intégrer les algorithmes dans vos propres outils sans réimplementer la conduite de pipeline.

Spectre.L'intégration de la console est disponible tant pour les renders en direct que pour le playback des documents, ce qui vous permet de traiter les images comme Rendables à l'intérieur des layouts. Les pages de paquet README et NuGet couvrent en détail la surface API.

Readmes & plongées profondes

Si vous voulez le détail technique intégral, ces sont les doctres canoniques:

Server MCP pour l'intégration de l'AI

ConsoleImage inclut un serveur MCP (Model Context Protocol) qui le transforme en une sonde visuelleM SK3 pour les flux de travail de l’AI . Plutôt que d’être simplement une "intégration AI parce qu’il a tendanceMSC6 ilMST7 est réellement utileM ST8 le modèle peut demander des vues réduites des médiasM st9 mesurer des signaux simplesMst10colourM St11 mouvementMSt12 changementMstr13 et seulement ensuite décider ce à conserverM str14

Étant donné que ConsoleImage peut produire des préviews perceptuellement significatives, une intelligence artificielle peut réfléchir sur le contenu vidéo de façon itérativeM SK1 échantillonnage , comparaison , et raffinage plutôt qu’à consommer des vidéos entières à l’oeil.

Les tâches d'AI concrète

Avec l’intégration de MCP, une AI peut:

  • Trouver des segments colorés: Scanner un vidéo à faible résolution, repérer les cadres de contraste les plus vibrants ou les plus élevés - et exporter un court GIF
  • Détecter les changements de scène: Mesure de l’énergie delta du cadre-àM SK2 pour déterminer les moments importants
  • Trouver le contenu d'intérêt: Utiliser l’héuristique pour trouver des cadres qui semblent contenir des personnes ou des figures humaines (à moins d’utiliser un détecteur réel
  • Générer des tableaux d'histoire: Créer une feuille de contact des cadres clés N en tant que document rendu unique

Exemple réelle: Construire cet article

Pendant la rédaction de cet article, J'ai utilisé ConsoleImage comme outil MCP pour trouver de bons clips d'exemple. Le flux de travailM SK2

→ 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)

Voici une petite prévision en braille à 30 largeur des caractères - suffisante pour repérer la composition et le mouvement

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

Cela m’a permis de scanner rapidement le contenu pour identifier des cadres intéressants plutôt que de rendre tout en pleine résolution.

Configuration

L’installation est une seule entrée de serveur MCP; voir le MCP README pour plus de détails. Les outils clés comprennent : render_image, render_to_gif, extract_frames, et compare_render_modes.

Architecture

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

Conclusion

Ce qui a commencé comme une mise en œuvre rapide de l’algorithme ASCII de ' par Alex Harri est devenu un système graphique terminal.

Principaux enseignements:

  • Shape-matching beats brightness mapping pour la qualité de sélection des caractères
  • Characters en braille fournir une résolution surprenante dans les terminaux
  • Rendement Delta est essentiel pour une reproduction uniforme du vidéo
  • Cohérence temporelle + compensation perceptuelle sont les différences entre "recognisableM SK1 et "watchable

Le code est du domaine public (Non-licensementM SK1 - l'utilisez comme vous le souhaitez. Les contributions sont bienvenues sur GitHub.

Coming Next: Partie 2 - lucidVIEW

Une autre fois, l’outil encadré - est lucidVIEW - un petit client Avalonia rapide, qui rend Markdown agréablement sans utiliser WebView .

Pour en savoir plus, consultez la partie 2.

Références

logo

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