ASCII 是原始字符之一的名稱編碼. 字符編碼將數字映射為字符形狀;數字 65 是 ASCII 方案中的大寫字母 A。 ASCII 僅允許大約 95 個可打印字符,並且非常以美國為中心。 但是在計算的黎明時期,在圖片被發明之前,有ASCII 藝術. 通常用電傳打字機在黃紙上打印,JMP 將使用藍紙。

沃爾特迪斯尼,源圖片在這裡. 感謝維基媒體!
此腳本使用 JMP 13 中的功能。 第一段代碼設置了一些參數;它們被移到腳本的前面,以便於調整設置。
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 );
接下來,構建一個數據表,描述字體中每個字符的亮暗程度。 該表有四列,每列都是一個公式列。 這代碼column 使用行號(加上 31)來生成 ASCII 碼。 這字符column 通過製作代碼的單元素矩陣,將其轉換為二進制,然後將其轉換為字符,將代碼轉換為可打印字符。 您將在下面看到另一個示例。 這位圖column 是一個包含字符圖片的表達式列。 最後,重要的n黑色column 包含字符中黑色像素的數量;它檢索像素矩陣並將它們相加。 因為字符是抗鋸齒的,所以結果不是整數,但這使它變得更好! 僅從位圖中獲取紅色像素陣列,因為所有三個 r、g、b 陣列對於白色背景上的黑色文本應該是相同的。
// 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>
從表中刪除一些行。 如果沒有元音,分散注意力的字母組合可能不會出現,並且一些字符(如下劃線)的所有像素權重都偏離中心,從而產生分散注意力的空白斑點。 我向後寫了循環,因為我認為我會沿途刪除行。 然後我弄清楚了 selectRows 和 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;
現在越來越近了。 縮放圖像(上面加載),確保它是灰度,並使用每個灰度像素從表中選擇一個字母。 由於在索引計算中使用了 NRows(dt),因此已刪除的行將被考慮在內。 變量指標保存數據表中行號(索引)的二維矩陣。 最後一行的矩陣魔法; dt:代碼[]是一維矩陣,但由二維矩陣索引。 結果是查找代碼的二維矩陣。
// 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)
到此圖像就完成了;它只需要顯示。 這將創建一個使用顯示框的 JMP 窗口,這些顯示框被迫保持數據表計劃使用的相同固定寬度字體。 您再次看到 blobToChar/MatrixToBlob 構造,但這次對代碼矩陣的一行中的多個代碼/字符進行操作。 r,0表示第 r 行的所有列。
// generate the displaybox tree
vl = V List Box( Button Box( url, Web( url ), <<UNDERLINESTYLE></UNDERLINESTYLE>
就是這樣。