ASCII はオリジナルのキャラクターの名前ですエンコーディング。 文字エンコーディングは、数値を文字の形状にマッピングします。数字の 65 は、ASCII スキームでは大文字の A です。 ASCII では印刷可能な文字は約 95 文字のみであり、非常に米国中心です。 しかし、コンピューティングの黎明期、画像が発明される前には、アスキーアート。 テレタイプでは黄色い紙に印刷されることが多いですが、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 );
次に、フォント内の各文字がどの程度明るいか暗いかを説明するデータ テーブルを作成します。 このテーブルには 4 つの列があり、それぞれが数式列です。 のコード列は行番号 (プラス 31) を使用して ASCII コードを作成します。 のチャー列は、コードの 1 要素行列を作成し、それをバイナリに変換し、それを文字に変換することによって、コードを印刷可能な文字に変換します。 以下に別の例を示します。 のビットマップ列は、キャラクターの写真を保持する表現列です。 そして最後に重要なことは、 nブラック列には文字内の黒ピクセルの数が保持されます。ピクセル行列を取得してそれらを加算します。 文字はアンチエイリアス処理されているため、結果は整数ではありませんが、そのおかげでさらに良くなりました。 白の背景に黒のテキストでは 3 つの 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) が使用されるため、削除された行も考慮されます。 変数インデックスデータテーブル内の行番号 (インデックス) の 2D 行列を保持します。 最後の行にはマトリックスマジック。 dt:コード[ ]は 1D 行列ですが、2D 行列によってインデックス付けされます。 結果は、検索されたコードの 2D マトリックスです。
// 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>
それでおしまい。