ASCII è il nome di uno dei personaggi originali codifiche . Una codifica dei caratteri mappa i numeri nelle forme dei caratteri; il numero 65 è una lettera A maiuscola nello schema ASCII. ASCII consente solo circa 95 caratteri stampabili ed è molto incentrato sugli Stati Uniti. Ma agli albori dell'informatica, prima che fossero inventate le immagini, c'era Arte ASCII . Spesso stampato su una telescrivente su carta gialla, JMP utilizzerà carta blu.

Walt Disney, immagine sorgente qui . Grazie Wikmedia!
Questo script utilizza le funzionalità di JMP 13. Il primo bit di codice imposta alcuni parametri; vengono spostati nella parte anteriore dello script per semplificare la modifica delle impostazioni.
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 );
Quindi, crea una tabella di dati che descriva quanto è chiaro o scuro ogni carattere nel font. Questa tabella ha quattro colonne e ognuna è una colonna Formula. IL codice la colonna utilizza il numero di riga (più 31) per creare un codice ASCII. IL char column trasforma il codice nel carattere stampabile creando una matrice di un elemento del codice, convertendola in binario e convertendola in carattere. Vedrai un altro esempio qui sotto. IL bitmap column è una colonna di espressioni che contiene le immagini dei personaggi. E infine, l'importante nNero la colonna contiene il numero di pixel neri nel carattere; recupera la matrice dei pixel e li somma. Poiché i caratteri sono anti-alias, il risultato non è un numero intero, ma questo lo rende ancora migliore! Solo l'array di pixel rossi viene recuperato dalla bitmap perché tutti e tre gli array r,g,b dovrebbero essere identici per il testo nero su sfondo bianco.
// 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>
Rimuovi alcune righe dalla tabella. Se non ci sono vocali, le combinazioni di lettere che distraggono potrebbero non essere visualizzate e alcuni caratteri, come il carattere di sottolineatura, hanno tutto il loro peso in pixel fuori centro, creando macchie di spazio bianco che distraggono. Ho scritto il ciclo all'indietro perché pensavo che avrei eliminato le righe lungo la strada. Poi ho capito come funzionavano selectRows e 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;
Mi avvicino adesso. Ridimensiona l'immagine (caricata sopra), assicurati che sia in scala di grigi e usa ogni pixel della scala di grigi per selezionare una lettera dalla tabella. Poiché NRows(dt) viene utilizzato nel calcolo dell'indice, le righe eliminate vengono contabilizzate. La variabile indici contiene una matrice 2D di numeri di riga (indici) nella tabella dati. Magia della matrice nell'ultima riga; dt:codice[ ] è una matrice 1D, ma indicizzata da una matrice 2D. Il risultato è una matrice 2D di codici cercati.
// 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)
A questo punto l'immagine è fatta; ha solo bisogno di essere visualizzato. Ciò creerà una finestra JMP utilizzando caselle di visualizzazione forzate a contenere lo stesso font a larghezza fissa previsto per la tabella dati. Si vede di nuovo la costruzione blobToChar/MatrixToBlob, ma questa volta operando su più codici/caratteri da una riga della matrice dei codici. r,0 indica tutte le colonne della riga r.
// generate the displaybox tree
vl = V List Box( Button Box( url, Web( url ), <<UNDERLINESTYLE></UNDERLINESTYLE>
Questo è tutto.