Convertissez la luminosité d’une image en art ASCII
Transformez une grille rectangulaire d’échantillons de luminosité en niveaux de gris en un art ASCII net et reproductible.
Lancer gratuitement
Indiquez des entiers allant de 0 pour le noir à 255 pour le blanc, puis choisissez une gamme de caractères classée du plus sombre au plus clair. Le convertisseur associe chaque échantillon à la position la plus proche dans cette gamme et conserve la grille sous forme de lignes de texte. Il convient aux aperçus dans un terminal, aux afficheurs textuels, à la programmation créative, à l’enseignement du traitement d’image et aux chaînes qui calculent déjà des moyennes de pixels ou de cellules.
Préparez une grille de luminosité adaptée
Commencez par un tableau rectangulaire dans lequel chaque tableau interne représente une ligne de sortie et chaque valeur une cellule de caractère. Les échantillons doivent être des entiers compris entre 0 et 255 : 0 correspond au noir complet, 255 au blanc complet et les valeurs intermédiaires aux différents gris. Si votre source est une photographie en pleine résolution, réduisez-la avant d’appeler le convertisseur. Calculez la moyenne d’un bloc de pixels pour chaque position de caractère, car transformer chaque pixel en caractère produit généralement un résultat immense et amplifie la différence de proportions entre pixels et glyphes. Toutes les lignes doivent conserver la même longueur. Pour un aperçu dans un terminal, 40 à 120 colonnes et un nombre de lignes inférieur constituent souvent un bon choix, les caractères étant généralement plus hauts que larges. L’entrée sous forme de luminosités vous laisse maîtriser en amont le redimensionnement, le recadrage, les couleurs, la transparence et le contraste. Une fois ces choix fixés, une même grille donne toujours le même texte.
Choisissez et comprenez la gamme ASCII
Saisissez la gamme en partant du caractère destiné à l’échantillon le plus sombre et en terminant par celui du plus clair. Une suite telle que <code>@%#*+=-:. </code> passe de signes visuellement denses à une espace finale : les zones noires deviennent marquées tandis que les zones blanches se fondent dans le fond. Inversez cet ordre pour une représentation claire sur fond sombre, ou utilisez <code>#.</code> pour obtenir deux tons très contrastés. Chaque caractère Unicode occupe une position, y compris les espaces et les emoji, même si les caractères ordinaires à chasse fixe assurent un alignement plus fiable. Pour chaque échantillon, le convertisseur répartit l’intervalle 0–255 sur les positions disponibles puis choisit la plus proche. Les extrémités sont exactes : 0 sélectionne toujours le premier caractère et 255 le dernier. Les répétitions sont autorisées afin d’élargir volontairement une plage tonale. Une gamme vide est refusée. Une espace finale reste significative, même si elle se voit mal dans un formulaire ou un lecteur JSON.
Exploitez le texte et les métadonnées
Le résultat contient <code>art</code>, une chaîne unique séparée par des retours à la ligne et directement utilisable dans un terminal, un fichier texte, un journal ou un bloc de code. Il fournit aussi <code>lines</code> sous forme de tableau, ce qui simplifie l’ajout d’une indentation, de bordures, de couleurs ANSI ou de numéros de ligne sans devoir redécouper le texte. Les nombres de lignes et de colonnes permettent de contrôler les dimensions avant l’affichage ou l’enregistrement, tandis que <code>ramp_length</code> indique combien de caractères Unicode ont participé à la conversion. Aucun tramage aléatoire n’est appliqué : avec une gamme courte, des luminosités voisines peuvent donc partager le même caractère. Ce comportement est volontaire et reproductible. Pour obtenir un tramage, préparez d’abord la grille avec une diffusion d’erreur déterministe ou une matrice ordonnée. Affichez l’art dans une police à chasse fixe et préservez les espaces. En HTML, insérez-le comme texte dans un élément préformaté, jamais comme balisage, notamment si la gamme contient des chevrons ou des esperluettes.
Cas d’usage
Créez des aperçus pour terminal
Transformez des cellules de gris réduites en texte compact pour les shells, journaux et outils en ligne de commande.
Expliquez la quantification de luminosité
Montrez comment des niveaux de gris apparemment continus deviennent des bandes tonales définies par une gamme finie.
Produisez des graphismes textuels déterministes
Générez des ressources ASCII reproductibles pour la documentation, les tests, les interfaces rétro ou la création numérique.
Questions fréquentes
Dans quel ordre faut-il écrire la gamme ?
Classez les caractères du symbole correspondant à la luminosité 0 jusqu’à celui correspondant à 255. Une gamme dense puis légère crée l’aspect classique d’une encre sombre sur fond clair.
Que se passe-t-il si la gamme est vide ?
La requête échoue avec une erreur d’entrée non valide, car aucun caractère ne permet alors de représenter la luminosité.
Les luminosités décimales sont-elles acceptées ?
Non. Chaque échantillon doit être un entier compris entre 0 et 255 inclus afin de garantir un contrat et une conversion reproductibles.
Le convertisseur redimensionne-t-il une image ?
Non. Il convertit une grille rectangulaire déjà préparée. Redimensionnez la source et calculez ses valeurs de gris avant l’envoi.
Quel est le coût d’une requête API ?
Chaque requête API coûte $0.002. Vous pouvez aussi exécuter gratuitement la même conversion déterministe dans votre navigateur.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/image/ascii-art-map \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"samples":[[0,64,128,192,255],[255,192,128,64,0]],"ramp":"@%#*+=-:. "}'const res = await fetch("https://api.kit.forhosting.com/image/ascii-art-map", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"samples": [
[
0,
64,
128,
192,
255
],
[
255,
192,
128,
64,
0
]
],
"ramp": "@%#*+=-:. "
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/ascii-art-map",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"samples": [
[
0,
64,
128,
192,
255
],
[
255,
192,
128,
64,
0
]
],
"ramp": "@%#*+=-:. "
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/ascii-art-map", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"samples":[[0,64,128,192,255],[255,192,128,64,0]],"ramp":"@%#*+=-:. "}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"samples":[[0,64,128,192,255],[255,192,128,64,0]],"ramp":"@%#*+=-:. "}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/ascii-art-map", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"samples": [
[
0,
64,
128,
192,
255
],
[
255,
192,
128,
64,
0
]
],
"ramp": "@%#*+=-:. "
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.ascii_art_map",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 15 |
max_megapixels | 12 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |