우리가 뭔가 그림을 표출하고 그 내용을 그림 파일로 저장하는 작업은 IDL에서 워낙 많이 하는 작업입니다. 그리고 이러한 작업을 할 때에는 당연히 그래픽 창을 먼저 띄우고 그 위에 그림을 표출하는 것이 너무나 당연한 것이고, 그 내용을 그림 파일로 파일로 저장하기도 합니다. 그런데 오늘 소개할 내용은 그래픽 창을 띄우지 않고 그림을 표출하는 방법에 관한 것입니다. 과연 그게 가능은 한 것인가 그리고 가능하다고 해도 그게 굳이 필요한가에 대한 의문이 생길 수 있습니다. 사실 통상적인 작업에서는 당연히 그래픽 창을 띄우고 그림을 표출하여 그 그림을 보면서 여러가지 필요한 수정 및 개선을 하는 것이 당연합니다.
하지만 유저가 원하던 형태의 그림이 표출되도록 프로그램의 모든 작업 체계가 완성된 상태에서 그 프로그램이 예를 들면 서버 같은 머신에서 자동으로 돌아가도록 하게 될 경우를 가정해본다면, 프로그램이 실행될 때마다 그래픽 창이 뜨는 것이 오히려 바람직하지 않을 수가 있습니다. 이와 같이 루틴하게 자동적으로 돌아가는 프로그램일 경우에는 그림을 표출하고 저장하는 작업이 조용히 즉 그래픽 창을 띄우지 않고도 진행될 수 있도록 하는 것이 더 바람직할 것입니다. 물론 이런 경우 외에도 다른 유용한 용도들이 있을 것입니다. 어쨌든 오늘은 그래픽 창을 띄우지 않고 그림을 표출하는 방법을 NG 체계와 DG 체계로 나누어 살펴보도록 하겠습니다.
< NG(New Graphics) 체계 >
먼저 NG 체계를 기준으로 그 방법을 소개해봅니다. 여기서는 간단한 플롯을 표출하는 경우를 예제로 사용하고자 합니다. 예제 데이터를 생성하고 그림을 표출하고 이를 그림 파일로 저장하는 과정까지 한꺼번에 보면 다음과 같습니다.
x = FINDGEN(121)
y = 1.7*SIN(2.0*x*!PI/25.0)*EXP(-0.02*x)
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, COLOR='tomato', $
FONT_SIZE=11, MARGIN=0.1, /CURRENT)
win.Save, 'zbuffer_ng.png', WIDTH=600
이 내용을 실행하면 그래픽 창이 뜨고 그림이 표출될 뿐 아니라 이 내용이 zbuffer_ng.png라는 그림 파일로도 저장될 것입니다. 그 모습은 다음과 같습니다.
그러면 위의 작업을 그래픽 창을 전혀 띄우지 않고 진행하는 방법을 봅시다. 방법은 꽤 간단합니다. WINDOW 함수를 사용할 때 BUFFER 키워드를 함께 사용하면 됩니다. 따라서 위의 내용에서 WINDOW 함수가 사용된 부분만 다음과 같이 변경해봅시다.
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR, /BUFFER)
참고로 BUFFER 키워드는 NG 체계의 그래픽 표출 작업을 할 때 그래픽 창을 화면에 띄우지 않고 그 대신 Z-Buffer라는 메모리 영역에서 작업을 할 것이냐 여부를 결정합니다. 디폴트 값은 0이며 이런 경우에는 평상시와 같이 그래픽 창을 화면에 띄우게 됩니다. 만약 1로 설정하면 그래픽 창을 화면에 띄우지 않고 메모리 상에서만 조용히 작업하게 됩니다. 위의 내용에서는 BUFFER 키워드의 값이 1로 설정된 것입니다(/BUFFER라는 표현은 BUFFER=1과 동일합니다). 따라서 위와 같이 변경을 한 후 전체 과정을 다시 실행해보면 이제는 화면상에서 그래픽 창이 전혀 표시되지 않은 상태로 그림의 표출 및 PNG 파일로의 저장 등의 작업이 똑같이 진행되는 것을 확인할 수 있을 것입니다.
< DG(Direct Graphics) 체계 >
그림을 화면에 띄우지 않고 메모리 상에서만 작업하는 방식은 DG 체계에서도 지원됩니다. 앞서 NG 체계의 예제와 유사한 그림을 DG 체계에서 표출해봅시다. 일단 그래픽 창을 띄워서 표출하는 통상적인 방법 기반의 과정은 다음과 같습니다.
DEVICE, DECOMPOSED=1
WINDOW, XSIZE=600, YSIZE=500
PLOT, x, y, COLOR='000000'x, BACKGROUND='FFFFFF'x, /NODATA, $
XMARGIN=[8, 8], YMARGIN=[4, 4]
OPLOT, x, y, COLOR='4763FF'x
cap = TVRD(/TRUE)
WRITE_PNG, 'zbuffer_dg.png', cap
이 내용을 실행하면 그래픽 창이 뜨고 그림이 표출될 뿐 아니라 이 내용이 zbuffer_dg.png라는 그림 파일로도 저장될 것입니다. 그 모습은 다음과 같습니다.
그러면 위의 작업을 그래픽 창을 전혀 띄우지 않고 진행하는 방법을 봅시다. 이를 위해서는 위의 내용을 다음과 같이 수정해야 합니다.
SET_PLOT, 'Z'
DEVICE, SET_RESOLUTION=[600, 500], SET_PIXEL_DEPTH=24
DEVICE, DECOMPOSED=1 WINDOW, XSIZE=600, YSIZE=500
PLOT, x, y, COLOR='000000'x, BACKGROUND='FFFFFF'x, /NODATA, $
XMARGIN=[8, 8], YMARGIN=[4, 4]
OPLOT, x, y, COLOR='4763FF'x
cap = TVRD(/TRUE)
WRITE_PNG, 'figures/20241023_zbuffer_dg.png', cap
SET_PLOT, 'win'
여기서는 몇가지 주목해야 할 사항들이 있습니다. 가장 먼저 SET_PLOT, 'Z' 명령을 실행하여 그래픽 디바이스를 Z-Buffer로 설정해야 합니다. 그리고 DEVICE 명령에서 SET_RESOLUTION 키워드로 Z-Buffer 영역 내에서의 가상 그래픽 창의 크기를 설정합니다. 또한 SET_PIXEL_DEPTH 키워드의 값을 24로 설정하였는데 이것은 그래픽 표출시 색공간을 24비트 즉 RGB로 설정함으로써 그림 내의 다양한 색상들이 온전하게 반영되도록 하기 위해서입니다. 그리고 여기서는 WINDOW 명령을 사용하여 그래픽 창을 띄우는 부분을 삭제해야 한다는 것도 유의해야 합니다. 그래픽 디바이스가 Z-Buffer인 상태에서는 WINDOW 명령의 사용이 허용되지 않기 때문입니다. 그림의 표출 및 저장의 과정은 이전과 동일합니다. 다만 모든 작업이 끝난 이후에는 그래픽 디바이스를 원래 상태로 복원하는 것이 바람직합니다. 이를 위하여 맨 마지막에서는 SET_PLOT, 'win' 명령을 실행하여 그래픽 디바이스가 윈도우가 되도록 하였습니다. 이것은 컴퓨터의 OS가 윈도우즈일 경우에 해당되며, Mac OS 머신인 경우에는 SET_PLOT, 'X' 명령으로 대체하면 됩니다. 어쨌든 위와 같이 변경된 내용을 다시 실행해보면 화면상에서 그래픽 창이 전혀 표시되지 않은 상태로 그림 표출 및 PNG 파일로의 저장 등의 작업이 똑같이 진행되는 것을 확인할 수 있을 것입니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
동영상 파일의 제작 [2] (1) | 2024.11.12 |
---|---|
동영상 파일의 제작 [1] (3) | 2024.11.07 |
플롯(Plot) 상에 축과 데이터 추가하기 [2] (1) | 2024.10.22 |
플롯(Plot) 상에 축과 데이터 추가하기 [1] (0) | 2024.10.16 |
IDL 9.1의 MAPCONTINENTS 함수 (0) | 2024.10.10 |