ASCII는 원래 캐릭터 중 하나의 이름입니다. 인코딩 . 문자 인코딩은 숫자를 문자 모양으로 매핑합니다. 숫자 65는 ASCII 체계의 대문자 A입니다. ASCII는 약 95개의 인쇄 가능한 문자만 허용하며 매우 미국 중심적입니다. 하지만 컴퓨팅이 시작되기 전, 사진이 발명되기 전, 아스키 아트 . 노란색 종이에 Teletype으로 인쇄하는 경우가 많지만 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 코드를 만듭니다. 그만큼 숯 열은 코드의 단일 요소 행렬을 만들고 이를 이진수로 변환한 다음 문자로 변환하여 코드를 인쇄 가능한 문자로 바꿉니다. 아래에서 또 다른 예를 살펴보겠습니다. 그만큼 비트맵 열은 문자 그림을 포함하는 표현식 열입니다. 그리고 마지막으로 중요한 것은 엔블랙 열은 문자의 검은색 픽셀 수를 보유합니다. 픽셀 매트릭스를 검색하여 추가합니다. 문자가 앤티앨리어싱되었기 때문에 결과는 정수가 아니지만 훨씬 더 좋습니다! 흰색 배경에 검정색 텍스트가 있는 경우 세 개의 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>
그게 다야.