IDL/New Graphics

그래픽 창의 캡쳐(capture) 기능 (NG 체계)

이상우_idl 2024. 11. 21. 15:29
728x90
반응형

지난번 게시물에는 DG 체계에서 그래픽 창의 화면을 캡쳐하기 위하여 TVRD 함수를 사용하는 방법을 예제와 함께 살펴본 바 있습니다. 오늘은 NG 체계에서 그래픽 창의 화면을 캡쳐하는 방법에 관하여 살펴보기로 합니다. NG 체계에서는 그래픽 창을 띄울 때 기본적으로 WINDOW 함수를 사용하는 것이 정석입니다. 즉 WINDOW 함수를 사용하여 그래픽 창을 띄워 놓고 그 다음에 여러가지 그래픽 표출용 함수들(PLOT, CONTOUR, IMAGE 등)을 사용하여 그림을 표출하게 됩니다. 그러면 NG 체계 기반으로 간단한 예제 그림을 표출하는 과정을 다음과 같이 진행해봅시다.

 

data = HANNING(600, 600)*100
add = FLTARR(600, 600)
add[300, 300] = HANNING(300, 300)*50
data = data+add
win = WINDOW(DIMENSIONS=[600, 700])
i = IMAGE(data, RGB_TABLE=34, POSITION=[0, 100, 600, 700], /DEVICE, /CURRENT)
c = CONTOUR(data, COLOR='black', C_THICK=2, /OVERPLOT)
cb = COLORBAR(TARGET=i, POSITION=[0.2, 0.05, 0.8, 0.1])

 

여기서는 가상의 2차원 배열인 data를 생성하고, WINDOW 함수로 그래픽 창을 띄워서 이미지로 표출하고 그 위에 등위선을 중첩하기 위하여 IMAGE 및 CONTOUR 함수를 사용하였습니다. 또한 COLORBAR 함수를 사용하여 하단에 컬러바도 표시하였습니다. 일단 이 과정에 의하여 그림이 표출된 그래픽 창의 모습은 다음과 같습니다.

 

이와 같이 그래픽 창에 그림이 표출된 상태에서 그래픽 창의 내용을 그대로 캡쳐해봅시다. NG 체계에서는 그래픽 창의 내용을 캡쳐하기 위하여 그래픽 창 개체에 대하여 CopyWindow 메서드를 사용하면 됩니다. 그 방법은 다음과 같습니다.

 

cap = win.CopyWindow()
HELP, cap

 

이와 같이 그래픽 창 개체인 win에 대하여 CopyWindow 메서드를 사용하면 그래픽 창의 내용을 캡쳐하여 이미지 배열로 가져오게 됩니다. HELP에 의하여 출력된 내용을 보면 캡쳐된 이미지 배열의 구조를 확인할 수 있습니다.

 

CAP             BYTE      = Array[3, 600, 700]

 

이렇게 캡쳐된 이미지 배열은 24비트 RGB 이미지에 해당됩니다. 즉 CopyWindow 메서드에 의하여 캡쳐되는 이미지는 24비트 RGB 이미지 배열의 형태로 획득된다는 것을 유념해야 합니다. 그리고 캡쳐된 이미지의 가로 및 세로 방향의 픽셀 크기는 원본 그래픽 창과 동일하게(여기서는 600x700) 얻어집니다. 그러면 이와 같이 캡쳐된 이미지 배열 cap을 별도의 그래픽 창에서 표출해봅시다.

 

winc = WINDOW(DIMENSIONS=[600, 700], /NO_TOOLBAR)
ic = IMAGE(cap, MARGIN=0, /CURRENT)

 

표출된 모습은 다음과 같습니다.

 

이 모습을 보면 어차피 당연한 얘기지만 캡쳐의 대상이었던 그래픽 창(win)의 그림과 동일한 모습으로 캡쳐가 되었음을 알 수 있습니다. 사실 NG 체계에서 CopyWindow 메서드를 사용하여 그래픽 창을 캡쳐하는 방법에 관해서는 특별히 더 주목해야 할 내용은 별로 없습니다. 물론 CopyWindow 메서드에서 지원되는 키워드들이 몇가지가 있긴 하지만, 이러한 키워드들을 굳이 사용하지 않고 그냥 CopyWindow()와 같은 문법으로 사용해도 원본 그래픽 창의 내용을 동일한 크기로 캡쳐할 수 있습니다.

 

다만 지난번 DG 체계에서의 캡쳐에 관한 게시물에서도 언급되었던 것과 같이, 24비트 RGB 이미지로 캡쳐된 배열을 의도적으로 8비트 이미지 배열로 변환해야 하는 경우를 여기서도 살짝 들여다봅시다. 이러한 처리는 캡쳐된 이미지를 GIF 파일로 저장해야 할 경우가 대표적입니다. 이러한 변환을 위해서는 COLOR_QUAN 함수를 사용하면 됩니다. 이러한 처리를 통하여 변환된 배열을 WRITE_GIF 명령에 투입하여 GIF 파일로 저장해봅시다. 그 과정은 다음과 같습니다.

 

capr = COLOR_QUAN(cap, 1, r, g, b)
WRITE_GIF, 'my_figure_ng.gif', capr, r, g, b

 

이러한 과정에 의하여 얻어진 GIF 파일의 모습은 다음과 같습니다.

 

이상과 같이 NG 체계에서 그래픽 창의 내용을 캡쳐하기 위해서는 그래픽 창 개체에 대하여 CopyWindow 메서드를 사용하면 됩니다. 그런데 만약 그래픽 창에 표출된 내용을 그냥 바로 그림 파일로 저장하는 것만이 목적이라면 우리가 이미 알고 있듯이 그래픽 창 개체에 대하여 Save 메서드를 사용하면 됩니다. 이런 경우라면 CopyWindow 메서드를 사용하여 캡쳐를 하는 과정은 굳이 필요하지 않을 것입니다.

 

win.Save, 'my_figure_ng.png', WIDTH=600

 

하지만 작업의 특성이나 목적 때문에 그래픽 창을 캡쳐한 이미지 배열이 꼭 필요한 경우라면, 오늘 소개된 내용과 같이 CopyWindow 메서드를 사용하면 된다는 점을 참고해두시면 될 것 같습니다.

 

 

 

이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

반응형