며칠전에 플롯상에 이미지를 표출하여 이 내용을 PS(PostScript)파일로 저장하는 방법을 소개해드렸습니다. 이 때 소개했던 내용은 IDL의 기존의 전통적인 그래픽 체계인 DG(Direct Graphics)에서의 방식이었는데요. 오늘은 8.0버전부터 도입된 새로운 그래픽 체계인 NG(New Graphics)에서의 방식을 소개하겠습니다.
먼저 플롯을 그리기 위한 예제 데이터입니다. 지난번에 사용했던 자료와 비슷하지만, X자료는 0~10의 범위를 갖고 Y자료는 0~100의 범위를 갖도록 약간 바꿔봤습니다. 이게 더 일반적인 경우가 될겁니다.
x = FINDGEN(101)*0.1
y = FINDGEN(101)
그리고 은하 이미지 자료는 지난번에 사용했던 자료와 동일합니다.
file = FILEPATH('galaxy.dat', SUBDIR=['examples', 'data'])
im = READ_BINARY(file, DATA_DIMS=[256, 256])
이제 먼저 WINDOW 함수를 사용하여 적당한 크기의 그래픽 윈도우를 만들고, 거기에 플롯을 먼저 그려봅니다. 플롯을 그릴 때 X 및 Y 축만 그리고자 하므로, PLOT 함수를 사용하면서 /NODATA라는 속성을 설정하였습니다.
이 좌표계상에 은하 이미지를 원하는 위치에 원하는 크기로 그려보기로 합니다. 물론 이를 위하여 IMAGE 함수를 사용하였는데, 여기서 가장 중요한 역할을 하는 것은 IMAGE_LOCATION, IMAGE_DIMENSIONS라는 속성들입니다. 이 두 속성은 말 그대로 표시하고자 할 이미지의 위치의 좌표 및 크기를 나타냅니다.
im1 = IMAGE(im, IMAGE_LOCATION=[3, 40], IMAGE_DIMENSIONS=[1.5, 15], /OVERPLOT, ASPECT_RATIO=0, /INTERPOLATE)
im1.RGB_TABLE = 20
여기서 보면 IMAGE_LOCATION은 [3, 40]으로 되어 있는데, 바로 앞서 그렸던 플롯 좌표계상에서 이미지의 왼쪽 하단 구석의 위치를 뜻합니다. 그리고 IMAGE_DIMENSIONS는 이 좌표계상에서 이미지가 X 및 Y 방향으로 차지하는 범위의 크기를 나타냅니다. 물론 앞서 그렸던 플롯 좌표계상에 표출하는 것이므로 /OVERPLOT이라는 속성을 반드시 사용해야 합니다. ASPECT_RATIO라는 속성을 0으로 해놨는데, 이것은 기본값인 1로 설정되도록 둘 경우 X축과 Y축의 비율을 데이터값에 맞춰버리기 때문에 X축이 너무 짧아지는 것을 막기 위한 방편입니다. 그리고 INTERPOLATE라는 속성은 지금 이미지를 원래 크기가 아닌 축소된 크기로 표출하는 중이므로, 축소 알고리즘을 Bilinear Interpolation으로 하겠다는 의미인데, 지금과 같이 축소일 경우에는 굳이 안해줘도 되긴 합니다. 그리고 RGB_TABLE이란 속성에 부여된 숫자는 컬러테이블 번호입니다. 이것은 원래 LOADCT라는 명령에서 사용했던 것과 같습니다. 그래서 여기서는 20번 컬러테이블로 이미지를 표출해본 것입니다. 이렇게 하면 다음 그림과 같은 결과를 우선 화면상에서 볼 수 있습니다.
물론 다른 컬러테이블을 사용하여 다른 위치에 이미지를 표출하는 것도 가능합니다. 같은 은하 이미지를 1번 컬러테이블을 써서 다른 위치에 다음과 같이 표출해보면 그 결과는 다음 그림과 같습니다.
im2 = IMAGE(im, IMAGE_LOCATION=[6, 20], IMAGE_DIMENSIONS=[1.5, 15], /OVERPLOT, ASPECT_RATIO=0, /INTERPOLATE)
im2.RGB_TABLE = 1
그런데 1번 컬러테이블을 사용하고는 싶으나, 색상배치의 순서를 뒤집고 싶다면 어떻게 해야 할까요? 이 경우에는 지난번 DG의 경우와 비슷한 과정이 필요합니다. 즉 1번 컬러테이블을 LOADCT로 불러놓고 TVLCT를 사용하여 red, green, blue 채널별 값들의 순서를 뒤집습니다. 다만 IMAGE 함수의 RGB_TABLE 속성에 대해서는 컬러테이블의 숫자 또는 3X256의 구조를 갖는 RGB 배열만 인자로 사용할 수 있기 때문에, 이를 맞춰주기 위하여 REVERSE 및 TRANSPOSE 함수가 추가로 사용됩니다. 그래서 이와 같은 과정을 거쳐 뒤집어진 1번 컬러테이블을 적용한 은하 이미지를 다른 위치에 표출하는 과정은 다음과 같습니다. 그리고 그 결과는 다음 그림과 같습니다.
im3 = IMAGE(im, IMAGE_LOCATION=[7, 50], IMAGE_DIMENSIONS=[1.5, 15], /OVERPLOT, ASPECT_RATIO=0, /INTERPOLATE)
LOADCT, 1
TVLCT, rgb, /GET
HELP, rgb
rgb = TRANSPOSE(REVERSE(rgb, 1))
HELP, rgb
im3.RGB_TABLE = rgb
그러면 이렇게 완성된 그림을 PS형식으로 저장해보겠습니다. 방법은 정말 간단합니다. 다음과 같이 윈도우 개체에 대하여 Save 메서드를 사용하되, 파일명의 확정자를 그냥 'PS'로 해주면 됩니다. 물론 EPS형식으로 저장하고자 한다면 확장자를 'EPS'로 해주면 됩니다. PDF일 경우에는 'PDF'라고 쓰면 됩니다. 다음 그림은 제가 EPS로 저장해본 모습을 캡쳐한 것입니다. 저장된 EPS 및 PDF 파일들도 함께 첨부하였습니다.
win.Save, 'test_galaxies.eps'
물론 일반적인 그림파일 형식인 JPG, PNG, GIF 등으로 저장할 경우에도 파일명의 확장자를 그렇게 적어주면 됩니다. 다만 이와 같은 형식들로 저장할 경우에는 RESOLUTION이라는 키워드를 96(DPI값임)으로 설정해줘야 가로 및 세로의 화소 크기가 원래 그래픽 윈도우의 크기와 동일하게 나옵니다. 이걸 안해주면 기본설정인 300DPI가 적용되므로 이미지의 크기가 너무 커지는 단점이 있다는 점만 유의하면 됩니다.
win.Save, 'test_galaxies.png', RESOLUTION=96
'IDL > New Graphics' 카테고리의 다른 글
SWx Monitor의 플롯 생성 루틴 소개 [1] (0) | 2011.12.15 |
---|---|
New Graphics에서 사용 가능한 컬러 목록 보기 (버전 수정) (0) | 2011.11.28 |
New Graphics에서 그래픽 표출 속도 향상법 (0) | 2011.11.04 |
New Graphics에서 사용 가능한 컬러 목록 보기 (버전 수정) (0) | 2011.09.23 |
새로운 그래픽 함수들 목록 정리 (8.1 기준) [3] (0) | 2011.08.04 |