[Linux] make Image viewer in Terminal

< original image >

 

< fontsize 12 : xterm-color >

 

< fontsize 2 : xterm-color >

 

< fontsize 2: xterm-greyscale>

 

 

 

 

 

 

 

 

Why need this program?

secure shell(ssh)을 통해 작업을 하다보면, GUI가 필요한 순간이 있다.

예를들면 딥러닝 작업을 할 때 결과물을 그래프로 보고 싶은 경우가 있다.

물론, scp(secure copy)를 통해 그래프를 로컬로 가져와서 보는 방법도 있지만, 아무래도 귀찮은 것이 사실이다.

이 경우에 (비록 저화질이더라도)터미널로 이미지를 바로 볼 수 있다면 작업속도가 향상 될 것이다.

 

 

 

GreyScale

각 글자 별로 칸을 차지하는 크기가 다르다는 것에 착안하였다.

Paul Bourke에 의하면(http://paulbourke.net/dataformats/asciiart/)  아래 문자열은왼쪽에서 오른쪽으로 갈 수록 밝아진다고 하였다.(검은색 배경, 흰색 폰트 기준)

[ .\’`^”,:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$]

 

따라서 이미지를 Greyscale 한 후, 위 문자열로 적당히 매핑해주면 될 것이다.

Greyscale에는 여러 방법이 있다.

Tanner(http://www.tannerhelland.com/3643/grayscale-image-algorithm-vb6/)가 이런 방법을 잘 정리해놓았다.

각자 원하는 방법으로 Greyscale을 하면 될 것이다.

(나는 r*0.2126 + g*0.7152 + b*0.0722의 수식을 썼을때 가장 그럴싸한 이미지를 얻었다.)

 

let black2white = "  .\'`^",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"

let greyscale = r*0.2126 + g*0.7152 + b*0.0722

let character = black2white.charAt(Math.floor(black2white.length * (greyscale - 0.0001) / 255));

 

 

 

Color quantization

Xterm color sheet(https://jonasjacek.github.io/colors/)를 보면 색상간에 규칙이 존재한다.

코드 16번(rgb(0,0,0))부터 b, g, r순으로 0, 95, 135, 175, 215, 255를 표현하고 있다.

즉 색상코드를 16 + R*6^2 + G*6 + B로 정의할 수 있다. (R, G, B는 r, g, b를 0 ~ 5 값으로 축소한 것)

RGB의 각 값은 0 ~ 255인데 반해, 표현 가능한 색상은 6가지 뿐이므로, 각 색상값마다 표현 가능한 가장 가까운 값으로 매핑할 필요가 있다.

 

매핑에는 여러 방법이 있겠지만, 나의 경우 아래의 방법을 썼다.

let colorGap = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5];

let color = colorGap[r/10] * 36 + colorGap[g/10] * 6 + colorGap[b/10] + 16

 

어떤 방법을 쓰든, 각 자리의 색상값을 매핑하여 출력하면, 216가지 색깔로 양자화 된 이미지가 나온다.

조금 더 다양한 색상을 표현하고 싶다면, 위 Greyscale 방법과 합쳐서 글자, 배경색, 전경색 세가지 요소로 픽셀을 표현해도 괜찮을 것이다.

 

 

 

Source code

아래 코드는 node.js 버전으로 작성되었으며, github(https://url)을 통해서도 받을 수 있다.

//CODE ADD

댓글 남기기