ASCII est le nom d'un des caractères d'origine encodages . Un codage de caractères mappe les nombres en formes de caractères ; le nombre 65 est une lettre majuscule A dans le schéma ASCII. ASCII ne permet qu'environ 95 caractères imprimables et est très centré sur les États-Unis. Mais à l'aube de l'informatique, avant l'invention des images, il y avait Art ASCII . Souvent imprimé sur un Teletype sur du papier jaune, JMP va utiliser du papier bleu.

Walt Disney, image source ici . Merci wikimédia !
Ce script utilise les fonctionnalités de JMP 13. Le premier bit de code définit certains paramètres ; ils sont déplacés au début du script pour faciliter la modification des paramètres.
fontsize = 6; // bigger font has more variation in pixel density but ... is bigger
fontname = "Courier New"; // monospaced fixed width is important for display
fontcolor = RGB Color( 0, 0, 0 ); // black. the characters never go completely black;
backgroundcolor = RGB Color( .75, 1, 1 ); // tinting the background helps darken the image
nlines = 100; // height of result, with big font you'll be scrolling
url = "https://upload.wikimedia.org/wikipedia/commons/d/df/Walt_Disney_1946.JPG";
// grab an image. Thanks wikipedia!
image = Open( url );
Ensuite, créez une table de données qui décrit le degré de clarté ou d'obscurité de chaque caractère de la police. Ce tableau comporte quatre colonnes, et chacune est une colonne de formule. Le code La colonne utilise le numéro de ligne (plus 31) pour créer un code ASCII. Le carboniser La colonne transforme le code en caractère imprimable en créant une matrice à un élément du code, en la convertissant en binaire et en la convertissant en caractère. Vous verrez un autre exemple ci-dessous. Le bitmap colonne est une colonne d'expression contenant des images des personnages. Et enfin, l'important nNoir la colonne contient le nombre de pixels noirs dans le caractère ; il récupère la matrice de pixels et les additionne. Parce que les caractères sont anti-aliasés, le résultat n'est pas un entier, mais c'est encore mieux ! Seul le tableau de pixels rouges est extrait du bitmap car les trois tableaux r, g, b doivent être identiques pour le texte noir sur fond blanc.
// build a table of ascii codes, sorted by pixel density
dt = New Table( "ASCII",
Add Rows( 95 ), // space thru just before rub-out
New Column( "code", numeric, formula( Row() + 31 ) ), // space is 32
New Column( "char", Character, "Nominal", Formula( Blob To Char( Matrix To Blob( code::code, "uint", 1, "big" ) ) ) ), // num to ascii
New Column( "bitmap", Expression, formula( Text Box( char, <<SETFONTSIZE></SETFONTSIZE>
Supprimez certaines lignes du tableau. S'il n'y a pas de voyelles, les combinaisons de lettres gênantes peuvent ne pas s'afficher et certains caractères, comme le trait de soulignement, ont tout leur poids en pixels décentré, créant des taches d'espace blanc gênantes. J'ai écrit la boucle à l'envers parce que je pensais supprimer des lignes en cours de route. Ensuite, j'ai compris comment fonctionnaient selectRows et deleteRows.
// remove vowels so words don't appear, and a couple of off-center characters so empty spots don't appear
For( r = N Rows( dt ), r >= 1, r--,
If( Contains( "AEIOUYaeiouy_`", dt:char[r] ),
dt << selectrows( r )
)
);
dt << DeleteRows;
Se rapprocher maintenant. Mettez l'image à l'échelle (chargée ci-dessus), assurez-vous qu'elle est en échelle de gris et utilisez chaque pixel d'échelle de gris pour sélectionner une lettre dans le tableau. Étant donné que NRows(dt) est utilisé dans le calcul de l'index, les lignes supprimées sont prises en compte. La variable index contient une matrice 2D de numéros de ligne (index) dans la table de données. Magie matricielle dans la dernière ligne; dt:code[ ] est une matrice 1D, mais indexée par une matrice 2D. Le résultat est une matrice 2D de codes recherchés.
// prepare the image, size, grayscale, look up letters for pixels
{oldx, oldy} = image << getsize; // need the old size to make a scale factor for resizing
image << scale( (nlines * 1.3) / oldx, nlines / oldy ); // stretch horz because font stretches vert
{r, g, b} = image << getPixels( "rgb" ); // in case the image isn't gray scale
gray = .30 * r + .59 * g + .11 * b; // 0..1 gray scale with 0:black and 1:white
indexes = Round( 1 + (N Rows( dt ) - 1) * gray ); // get indexes into the data table (descending needed here!)
codes = dt:code[indexes]; // the heavy lifting is in this line: get the ascii codes (still numbers)
À ce stade, l'image est terminée ; il suffit de l'afficher. Cela créera une fenêtre JMP à l'aide de zones d'affichage forcées de contenir la même police à largeur fixe que la table de données prévoyait. Vous voyez à nouveau la construction blobToChar/MatrixToBlob, mais cette fois en opérant sur plusieurs codes/caractères à partir d'une ligne de la matrice de codes. r,0 désigne toutes les colonnes de la ligne r.
// generate the displaybox tree
vl = V List Box( Button Box( url, Web( url ), <<UNDERLINESTYLE></UNDERLINESTYLE>
C'est ça.