꽤 오랜만에 새 글을 올리게 되었습니다. 요 며칠 다른 일로 좀 바빴네요. 오늘은 새로운 그래픽 체계의 기능들 중에서 IMAGE 함수에 대한 소개를 하겠습니다. 기존의 다이렉트 그래픽 체계에서는 이미지를 표출하는 어떤 정형화된 과정이 있습니다. 예를 들어 JPG나 PNG 등과 같은 그림파일이 있다고 하면, FILEPATH 함수로 그 파일의 경로를 잡아주고, READ_IMAGE와 같은 함수로 파일로부터 이미지 배열을 얻은 다음, TV나 TVSCL과 같은 명령들을 사용하는 것입니다. 하지만 새로운 그래픽 체계에서는 상당부분이 IMAGE 함수로 다 처리가 됩니다. 예제를 통하여 알아보기로 합시다.
먼저 사용할 예제 파일은 IDL의 설치 디렉토리에서 examples/data에 있는 marsglobe.jpg라는 파일입니다. 먼저 FILEPATH 함수를 이용하여 이 파일의 폴더경로는 다음과 같이 정해줘야겠죠.
imfile = FILEPATH('marsglobe.jpg', SUBDIR=['examples', 'data'])
자 이제는 READ_IMAGE나 READ_JPEG를 사용해야 할 것 같은데, 사실 이렇게 일반적인 형식의 이미지 파일일 경우는 이 과정조차도 필요가 없습니다. 그냥 다음과 같이 IMAGE 함수를 바로 사용하면 됩니다. 그래도 다음 그림과 같이 이미지가 제대로 표출됩니다.
물론 다음과 같이 이미지 파일로부터 이미지 배열을 얻고 이 배열에 대하여 IMAGE 함수를 사용하는 전통적인 방식을 사용해도 아무런 차이가 없습니다. 다만 이미지 배열을 따로 얻어서 이 배열에 대하여 여러가지 처리를 수시로 하고자 한다면 당연히 이 방식을 사용해야 하겠지요.
imdata = READ_IMAGE(imfile)
image = IMAGE(imdata)
위와 같이 일반적인 형식의 이미지 파일이 아닌 바이너리 형식이나 그 외 특수한 형식의 파일이라면 이미지 배열을 생성하는 과정이 필요합니다. 바이너리 파일의 예를 하나 들어보기 위하여 다음과 같이 동일한 폴더에 있는 nyny.dat라는 파일을 읽어봅시다.
imfile = FILEPATH('nyny.dat', SUBDIR=['examples', 'data'])
여기서 만약 imfile에 대하여 바로 IMAGE 함수를 적용하면 에러가 납니다. 다음과 같이 파일의 내용을 이미지 배열로 얻고 이 배열에 대하여 IMAGE 함수를 적용해야 합니다. 그러면 다음 그림과 같이 이미지가 제대로 표출됩니다.
imdata = READ_BINARY(imfile, DATA_DIMS = [768, 512])
image = IMAGE(imdata)
참고로 이 이미지는 768X512의 크기를 갖는 8비트 이미지입니다(앞선 예제에서 봤던 marsglobe.jpg의 경우는 24비트 RGB 이미지였습니다). 따라서 컬러 테이블을 적용해볼 수 있습니다. IMAGE 함수로 이미지를 표출할 때 컬러 테이블의 설정은 이 함수의 속성들 중 하나인 RGB_TABLE을 사용합니다. 전통적인 방식인 LOADCT와 같은 명령은 사용되지 않습니다. 그래서 예를 들어 5번 컬러 테이블을 적용하려면 다음과 같이 해주면 됩니다. 그러면 다음 그림과 같이 5번 컬러 테이블이 적용된 모습을 볼 수 있습니다.
그런데 사실 imdata의 값을 확인해보면 최소값이 91이고 최대값은 255입니다. 나름 BYTE로 스케일된 것이긴 한데 최소값이 0이 아니죠. 그래서 색상 역시 컬러 테이블상에서 91번부터 255번까지의 색상들만으로 표출이 되어 있습니다. 만약 0번부터 255번까지 모든 색상을 사용하여 표출되도록 하려면 어떻게 할까요? 맞습니다. imdata에 대하여 BYTSCL 함수를 사용하는 방법이 있습니다. 그런데 여기서는 그렇게 할 필요도 없습니다. IMAGE 함수의 속성들 중 MIN_VALUE, MAX_VALUE를 사용하면 됩니다. 여기서는 다음과 같이 MIN_VALUE 속성만 실제 imdata의 최소값으로 잡아주면 됩니다. 그러면 다음 그림과 같이 컬러 테이블상의 모든 색상들이 사용되어 표출이 됩니다.
image.MIN_VALUE=MIN(imdata)

IMAGE 함수를 도움말에서 찾아보면 여러가지 속성들이 있습니다. 그 중 투명도를 조절하는 TRANSPARENCY라는 것이 있는데, 0에서 100 사이의 값을 갖고 0이면 완전 불투명이고 100이면 완전 투명이 됩니다. 그래서 다음과 같이 이 속성값을 50으로 잡아주면, 다음 그림과 같이 중간 정도로 투명한 상태가 됩니다.
image.TRANSPARENCY = 50

그래서 다음 두 개의 반복문을 연달아 실행을 해보세요. 그러면 이미지가 투명해졌다가 다시 원상태로 서서히 돌아오는 재미있는 효과도 볼 수 있습니다.
FOR i = 0, 100 DO image.TRANSPARENCY = i
FOR i = 0, 100 DO image.TRANSPARENCY = 100-i
그 외 IMAGE 함수의 다양한 속성들은 도움말을 참조하시길 바랍니다. 이 글에서는 기본적인 사용법 위주로 살펴보았습니다. 일단 글제목에 [1]이라는 번호는 붙여놨는데, 혹시나 또 IMAGE 함수에 대하여 소개할만한 거리가 생기면 그 때 [2]라는 번호를 붙여서 올려보기로 하겠습니다.