Distorsion✨ Premium

ASCII Art Renderer

Convertit une vraie image en caractères ASCII dans le navigateur : chaque pixel réduit devient une lettre plus ou moins dense, en vert lumineux qui pulse doucement.

CSSMonospaceTerminal

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Distorsion comprend 31 effets, dont 5 gratuits. Découvrir la catégorie →

3 exemples d'usage

Mascotte d'un projet libre, dessinée en caractères — ASCII Art Renderer exemple 1

① Mascotte d'un projet libre, dessinée en caractères

QuandSur la page d'un petit outil en ligne de commande, l'illustration de la mascotte (un renard) est convertie en ASCII orangé dans un cadre, à côté d'un exemple de commande et du nombre de contributeurs.
PourquoiUn projet qui vit dans le terminal se présente avec une image faite de caractères : la mascotte reste reconnaissable et le visiteur comprend tout de suite l'univers du projet.
Réglagesdata-cols="auto", --ascg-w: 230px, --ascg-size: 6px, --ascg-spacing: 0, --ascg-color: #ffb86b, --ascg-glow: 255,170,90, --ascg-border: #3d2a14. Image source : un SVG de démonstration en data:.
Paysage converti en fond plein cadre d'une page de conférence — ASCII Art Renderer exemple 2

② Paysage converti en fond plein cadre d'une page de conférence

QuandEn tête de la page d'une soirée de conférences sur le terminal, un paysage de montagnes sous la lune est converti en caractères bleus sur toute la largeur ; le titre, la date et le bouton de réservation tiennent dans un encart opaque.
PourquoiLa conversion en mode auto remplit toute la largeur : on obtient un fond texturé qui reste une vraie image, sans fichier supplémentaire à préparer. L'encart opaque garde le texte lisible.
RéglagesRacine en position: absolute; inset: 0, --ascg-w: 100%, --ascg-h: 100%, --ascg-size: 7px, --ascg-spacing: 0, --ascg-border: transparent, couleur #9fd3ff ; la scène retire le rayon et la marge du cadre.
Aperçu de l'avatar en caractères après le choix d'une image — ASCII Art Renderer exemple 3

③ Aperçu de l'avatar en caractères après le choix d'une image

QuandDans les réglages d'une application de listes, le membre clique sur l'une des trois vignettes : l'avatar de sa carte de profil est aussitôt reconverti en caractères verts dans un médaillon.
PourquoiChanger le src de l'image suffit : l'effet relance la conversion au chargement. Le profil garde une identité visuelle cohérente, quelle que soit la photo choisie.
Réglages--ascg-w: 150px, --ascg-size: 4px, --ascg-spacing: 0 ; le script de la scène ne fait que remplacer le src et le alt de .ascg-src au clic sur une vignette. Médaillon rond par la scène (border-radius: 50% sur le cadre).

Comment ça marche

Vous placez votre image dans .ascg-frame sous la forme d'un <img class="ascg-src"> (ou d'un data-src). Au chargement, le script la dessine en tout petit sur un canvas hors écran : un pixel par caractère. Le nombre de colonnes vient de data-cols (auto par défaut : autant de caractères que la largeur du cadre en contient) ; le nombre de lignes suit les proportions de l'image et la taille réelle d'un caractère, mesurée dans la police utilisée.

getImageData() lit ensuite chaque pixel. Sa luminance (0,2126 R + 0,7152 G + 0,0722 B, multipliée par l'opacité) choisit un caractère dans la gamme data-chars, du plus sombre au plus clair : " .:-=+*#%@" par défaut. Un pixel noir donne une espace, un pixel blanc un @. Le texte obtenu remplit <pre class="ascg-art">, une ligne par <span>, et l'image d'origine est masquée.

La lueur verte de chaque ligne pulse en 2 s (animation ascgGlow), une ligne sur deux décalée d'une demi-seconde. Si le cadre change de largeur, un ResizeObserver relance la conversion (avec data-cols="auto" seulement) ; si vous changez le src de l'image, elle est reconvertie à son chargement. Le code de démonstration contient une tête de chat en SVG inscrite en data:, à remplacer par votre image.

Accessibilité

  • Texte alternatif : le <pre> porte role="img" et reçoit le alt de votre image en aria-label : un lecteur d'écran annonce « Tête de chat », pas des centaines de signes. Écrivez donc un alt qui décrit l'image.
  • Réduire les animations : sous prefers-reduced-motion: reduce, la lueur ne pulse plus ; le dessin reste affiché avec une lueur fixe. La conversion elle-même n'est pas une animation.
  • Sans JavaScript ou image illisible : l'image d'origine reste affichée normalement dans le cadre. C'est aussi le cas pour une image d'un autre domaine servie sans autorisation CORS, que le navigateur interdit de lire.
  • Lisibilité : le dessin est décoratif par nature ; ne mettez pas dans l'image un texte que le visiteur doit lire, il deviendrait illisible une fois converti.

Compatibilité navigateur

Canvas 2D, getImageData, ResizeObserver et 3,2 Ko de JavaScript, sans dépendance. La plus récente des fonctions utilisées est ResizeObserver (Chrome 64, Firefox 69, Safari 13.1 d'après les données MDN) ; sans elle, la conversion se fait au chargement mais ne suit pas les changements de largeur. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : conversion identique (une image SVG en data: se lit dans les trois), deux copies indépendantes, aucune variable sur window, aucun travail hors écran.

Chrome 64+✓ Complet (mesuré)
Firefox 69+✓ Complet (mesuré)
Safari 13.1+✓ Complet (mesuré sous WebKit)
Edge 79+✓ Complet
Mobile iOS 13.4+✓ Complet
Android Chrome 64+✓ Complet

Sans JavaScript, l'image d'origine s'affiche dans le cadre noir. Une image d'un autre domaine sans en-tête CORS (ou sans crossorigin="anonymous") ne peut pas être lue par le canvas : elle reste affichée telle quelle, sans erreur.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0273-root" data-cols="auto">
  <div class="ascg-frame">
    <img class="ascg-src" alt="Tête de chat" src="votre-image.jpg">
    <pre class="ascg-art" role="img"></pre>
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Votre image (HTML — <img class="ascg-src" src="…" alt="…"> ou data-src) Tête de chat en SVG de démonstration Image du même domaine, en data:, ou d'un serveur qui autorise CORS (ajoutez alors crossorigin="anonymous"). Les images contrastées, sur fond sombre, donnent les meilleurs résultats.
Colonnes (HTML — data-cols sur la racine) auto (largeur du cadre) Un nombre fixe (40, 80, 120…) donne la même finesse partout ; la hauteur suit les proportions de l'image. Limité entre 8 et 240.
Gamme de caractères (HTML — data-chars) " .:-=+*#%@" Du plus sombre au plus clair. " ░▒▓█" donne des blocs pleins, " 01" un rendu binaire.
Inverser (HTML — data-invert="true") Non Pour un sujet sombre sur fond clair, ou pour afficher le dessin en caractères sombres sur un cadre clair.
Finesse (CSS — --ascg-size, --ascg-spacing) 10 px, espacement 1 px 4 à 6 px avec --ascg-spacing: 0 pour un portrait détaillé ; 12 px et plus pour un rendu gros grain.
Couleurs (CSS — --ascg-color, --ascg-glow, --ascg-border) #3f3, 51,255,51, #0f0 --ascg-glow s'écrit en trois nombres r,g,b. Ambre, bleu ou blanc changent complètement l'ambiance.
Cadre (CSS — --ascg-w, --ascg-h, --ascg-page, --ascg-root-h) 280 px × 140 px minimum, fond #0a0a0f --ascg-w: 100% avec data-cols="auto" remplit une zone entière ; --ascg-page: transparent et --ascg-root-h: 0 retirent le cadre de démonstration.

FAQ

Le navigateur interdit au canvas de lire une image venue d'un autre domaine sans autorisation CORS. Servez l'image depuis votre site, en data:, ou depuis un serveur qui envoie Access-Control-Allow-Origin, et ajoutez crossorigin="anonymous" sur la balise <img>.
Non. L'image est réduite à une case par caractère (par exemple 60 × 30 pixels) avant d'être lue : quelques milliers de pixels, une seule fois au chargement, puis à chaque changement de largeur du cadre en mode auto. Rien ne tourne en continu ; seule la lueur est animée en CSS.
Pas avec ce code : il convertit une image fixe, au chargement et quand son src change. Pour une vidéo, il faudrait relancer la lecture du canvas à chaque image, ce que l'effet ne fait pas.