IDL/Direct Graphics

PostScript에서 플롯과 이미지를 함께 표출하기 [1]

이상우_idl 2011. 11. 7. 10:10
728x90
반응형

포스트스크립트(PostScript) 형식은 PDF 등에 밀려 요즘은 좀 그 세력이 약해졌지만 그래도 아직까지 꽤 널리 사용되는 형식입니다. IDL에서도 물론 이러한 형식을 지원하는데, 아무래도 그냥 그래픽 윈도우상에서의 표출방법과 PS에서의 표출방법은 차이가 있습니다. 오늘은 PS의 형식으로 플롯과 이미지를 함께 표출하는 예제를 살펴보기로 하겠습니다. 이러한 표출은 기존의 DG(Direct Graphics) 및 새로운 NG(New Graphics) 모두에서 가능하지만, 오늘은 DG에서의 구현방법만 먼저 보기로 합니다.


사실 이와 같은 표출은 그냥 그래픽 윈도우상에서는 비교적 쉽게 이루어집니다. 최근에 IDLUser.org 사이트에 올라왔던 질문에 대하여 제가 답변했던 내용을 기반으로 한 예제를 하나 소개합니다. 예제코드는 아래와 같은데, 아마 IDL을 사용중인 일반적인 유저들이라면 내용을 이해하는데 있어서 큰 어려움은 없으리라 생각됩니다. 먼저 적당한 크기의 윈도우를 띄웁니다. 그리고 배경색은 흰색으로 하겠습니다.


DEVICE, DECOMPOSED = 0

WINDOW, XSIZE=300, YSIZE=300

!P.BACKGROUND = 255


임의의 X, Y 배열을 생성하려 플롯을 하나 그려봅니다. 배경이 흰색이므로 플롯은 검은색으로 그립니다. 그리고 플롯을 그림으로써 생성된 X-Y 공간상에 나중에 이미지를 배치할 것이므로, 플롯의 X, Y축만 그리기 위하여 NODATA 키워드가 사용되었습니다.


x = FINDGEN(101)

y = FINDGEN(101)

PLOT, x, y, COLOR=0, /NODATA


이미지의 경우는 IDL 설치폴더의 examples/data에 있는 galaxy.dat라는 바이너리 파일을 읽은 2차원 자료를 사용하였습니다. 이는 8비트 이미지에 해당됩니다.


file = FILEPATH('galaxy.dat', SUBDIR=['examples', 'data'])

im = READ_BINARY(file, DATA_DIMS=[256, 256])


이 예제에서는 플롯으로 생성된 X-Y 공간상의 특정 위치에 특정 크기로 이미지를 표출합니다. 참고로 원본 이미지는 256X256이고, 현재 그래픽 윈도우의 크기는 300X300입니다. 여기서는 플롯상의 [30, 40]의 좌표에 이 이미지를 50X50의 화소크기를 갖도록 축소하여 표출하려 합니다. 물론 이 좌표는 이미지의 왼쪽하단 구석부분에 해당됩니다. 이를 위하여 다음과 같이 CONGRID 함수를 사용하여 이미지를 축소하였습니다.


im1 = CONGRID(im, 50, 50)


그리고 이미지를 표출하는데 있어서 컬러테이블은 3번을 사용합니다. 다만, 지금 윈도우의 배경이 흰색인데 이 컬러테이블을 그대로 적용하면 이미지 자체는 검은 배경으로 나옵니다. 따라서 이미지도 연한색 배경이 되도록 하기 위하여 다음과 같이 TVLCT 명령을 사용하여 컬러테이블의 색상순서를 뒤집었습니다.


LOADCT, 3

TVLCT, red, green, blue, /GET

TVLCT, REVERSE(red), REVERSE(green), REVERSE(blue)


이제 TVSCL 명령을 사용하여 이미지를 표출합니다. 이미지가 표출될 위치좌표의 X, Y값이 차례로 인자로 사용되었습니다.


TVSCL, im1, 30, 40, /DATA


이와 같이 그려진 그림의 모습은 아래와 같습니다.



자 그러면 이와 같은 그림을 PostScript 형식으로 그려보기로 합니다. PostScript는 그냥 윈도우와는 체계가 다르므로 그림을 그리는 방식도 당연히 다릅니다. 먼저 그래픽 디바이스를 다음과 같이 'PS'로 설정해야 합니다. 참고로 그냥 그래픽 디바이스를 그냥 윈도우로 사용하려면(기본설정이죠)는 OS가 MS Windows의 경우는 'Win'이고 Mac OS X나 유닉스 또는 리눅스인 경우에는 'X'가 됩니다. 그리고 DEVICE 명령을 사용하여, 만들고자 하는 PS파일의 이름을 정해줍니다. 물론 이외에도 PS파일의 사이즈나 여백 등도 설정할 수 있는데, 자세한 것은 IDL 도움말에서 DEVICE 명령에 관한 설명을 보면 소개되어 있으므로 생략합니다. 그리고 흑백으로만 그림을 그릴 경우에는 여기까지만 하면 되지만, 지금과 같이 컬러가 들어간 그림을 PS로 그리려면 추가적인 설정이 필요합니다. 다음과 같이 DEVICE 명령에 COLOR 및 BITS_PER_PIXEL이라는 키워드를 추가적으로 사용해야 합니다.


SET_PLOT, 'PS'

DEVICE, /COLOR, BITS_PER_PIXEL=8, FILENAME='test.ps'


여기서 COLOR는 당연히 컬러가 들어간 PS파일을 생성하겠다는 의미입니다. 그리고 BITS_PER_PIXEL은 컬러의 비트수를 설정하는 것인데, PS의 경우는 최대 8비트까지 지원됩니다. 즉, 24비트 트루컬러 이미지는 PS로는 표출되지 않음을 유의해야 합니다. 그리고 PS가 아닌 EPS(Encapsulated PostScript)의 형식으로 생성해야할 경우도 있는데, 이러한 경우는 앞의 DEVICE 명령의 내용이 다음과 같이 바뀌면 됩니다. 즉, ENCAPSULATED라는 키워드를 추가로 사용하고, 파일명의 확장자는 eps로 끝나야 합니다.


DEVICE, /COLOR, BITS_PER_PIXEL=8, FILENAME='test.eps', /ENCAPSULATED


이 뒷부분의 과정은 앞에서 윈도우에 그렸던 내용과 같습니다. 그러나 TVSCL명령의 내용부터는 약간 달라집니다. 여기서는 TVSCL 명령을 다음과 같이 사용해야 합니다.


TVSCL, im1, 30, 40, /DATA, /CENTIMETERS, XSIZE=5, YSIZE=7


여기서는 CENTIMETERS, XSIZE, YSIZE라는 키워드들이 추가적으로 사용되었습니다. 이것은 그림을 플롯공간상의 [30, 40]이라는 좌표에 표출하되, 그 크기는 cm단위로 가로 5cm, 세로 7cm가 되도록 하라는 의미입니다. 물론 INCHES라는 키워드를 사용하면 인치단위로도 설정이 가능합니다. PostScript는 종이페이지를 기반으로 한 형식이라 이러한 설정이 가능한 것입니다.


이제 모든 그리기 과정들이 끝난 후에는 다음과 같이 DEVICE 명령을 한번 더 사용하여 CLOSE를 해주고, 맨 처음에 사용했던 SET_PLOT 명령을 다시 한번 사용하여 그래픽 디바이스를 원래 상태로 돌려놓고 마무리하면 됩니다. 물론 이 부분은 사용중인 OS에 맞도록 사용하면 됩니다. 참고로 저는 Mac OS X를 사용중이라 'X'로 설정하였습니다.


DEVICE, /CLOSE

SET_PLOT, 'X'


이렇게 하여 생성된 PS 또는 EPS 파일을 전용뷰어로 열어보면 아마 앞의 그림과 유사한 형태로 생성되었을 것입니다. 저는 EPS파일로 생성해보았는데, 그 모습은 다음 그림과 같습니다.



사실 이러한 작업은 IDL 8.0이상의 버전이라면 NG체계에서도 가능합니다. 그 방법은 나중에 정리해서 소개하도록 하겠습니다.

반응형