IDL에서 그래픽 창에 그림을 표출한 다음 그 화면 자체를 캡쳐(capture)해야 하는 경우들이 종종 있습니다. 그림 파일로 저장하기 위한 목적일 수도 있고, 또는 얼마 전에 소개했던 동영상 파일의 제작을 위한 목적일 수도 있습니다. 사실 IDL에서 그래픽 창의 화면을 캡쳐하는 방법에 관해서는 이 블로그의 여러 게시물들에서 간접적으로 다뤄진 적이 꽤 있긴 하지만, 이번에는 캡쳐 방법 자체에 좀 더 촛점을 맞춰서 다뤄보고자 합니다. 또한 이러한 캡쳐의 방법은 그래픽 체계에 따라 다릅니다. 즉 DG(Direct Graphics) 체계 및 NG(New Graphics) 체계의 방법론이 서로 다르기 때문에 각 체계별로 나눠서 소개해보겠습니다. 그래서 오늘은 먼저 DG 체계에서 그래픽 창의 화면을 캡쳐하는 방법에 관하여 살펴보기로 합니다.
DG 체계에서는 그래픽 창을 띄울 때 기본적으로 WINDOW 프로시저를 사용하는 것이 정석입니다. 즉 WINDOW 프로시저로 그래픽 창을 띄워 놓고 그 다음에 여러가지 그래픽 표출용 프로시저들(PLOT, CONTOUR, TV 등)을 사용하여 그림을 표출하게 됩니다. 그러면 DG 체계 기반으로 간단한 예제 그림을 표출하는 과정을 다음과 같이 진행해봅시다.
DEVICE, DECOMPOSED=0
WINDOW, 0, XSIZE=600, YSIZE=500
LOADCT, 0
x = FINDGEN(101)
y = SQRT(x)
PLOT, x, y, COLOR=0, BACKGROUND=225
이러한 내용을 실행하면 그래픽 창이 뜨고 간단한 플롯이 표출되는데 그 모습은 다음과 같을 것입니다.
이와 같이 그래픽 창에 그림이 표출된 상태에서 그래픽 창의 내용을 그대로 캡쳐해봅시다. DG 체계에서는 그래픽 창의 내용을 캡쳐하기 위하여 TVRD 함수를 사용하면 됩니다. 그 방법은 다음과 같습니다.
cap = TVRD()
HELP, cap
원래 TVRD 함수는 인수(argument)를 받지 않고 몇몇 키워드들만 지원되는데, 위와 같이 키워드 없이 그냥 사용하는 것도 가능합니다. 어쨌든 이와 같이 TVRD 함수를 사용하여 그래픽 창의 내용을 캡쳐할 수 있으며 캡쳐된 결과는 이미지 배열의 형태로 얻어집니다. 즉 HELP에 의하여 출력된 내용을 보면 다음과 같습니다.
CAP BYTE = Array[600, 500]
이와 같이 캡쳐된 이미지는 별도의 그래픽 창을 띄워서 표출해볼 수 있습니다. 즉 다음과 같이 또 다른 그래픽 창을 띄우고 앞서 캡쳐된 이미지를 표출해봅시다.
WINDOW, 1, XSIZE=600, YSIZE=500
TV, cap
표출된 모습은 다음과 같습니다.
일단 DG 체계에서 그래픽 창을 캡쳐하기 위해서는 이와 같이 TVRD 함수를 사용하면 됩니다. 다만 TVRD 함수를 사용하는데 있어서 유의해야 할 점이 있는데, 만약 그림 내의 색상 구성이 위의 예제와 같이 흑백 계열의 색상 이외의 색상들로 구성되어 있는 상태에서 TVRD()로 캡쳐를 하면 그 색상들이 제대로 반영되지 않는다는 것입니다. 그러면 이 문제를 살펴보기 위하여 위의 예제를 다음과 같이 살짝 바꿔서 흑백 계열 이외의 색상들이 사용되도록 해봅시다.
DEVICE, DECOMPOSED=0
WINDOW, 0, XSIZE=600, YSIZE=500
LOADCT, 39
x = FINDGEN(101)
y1 = SQRT(x)
y2 = SQRT(x)/2
PLOT, x, y1, /NODATA, COLOR=0, BACKGROUND=255
OPLOT, x, y1, COLOR=250
OPLOT, x, y2, COLOR=60
여기서는 두 종류의 데이터(y1, y2)를 표시하는데 있어서 39번 컬러테이블의 색상들 중 두가지를 골라서 플롯 라인에 반영되도록 한 것입니다. 표출된 그림의 모습은 다음과 같습니다.
이제 이러한 그림이 표출된 그래픽 창의 내용을 TVRD 함수로 캡쳐해봅시다. 일단 앞서 했던 것과 동일한 방법으로 진행해봅시다.
cap = TVRD()
HELP, cap
WINDOW, 1, XSIZE=600, YSIZE=500
TV, cap
즉 위와 같이 TVRD 함수를 사용하여 캡쳐를 하고, 캡쳐된 이미지를 별도의 그래픽 창에 표출합니다. 그 모습은 다음과 같습니다.
그런데 이 모습을 보면 두 종류의 플롯 라인들이 캡쳐에 반영되지 않은 것으로 보입니다. 사실 이렇게 되는 정확한 원인은 저도 잘 모르겠지만, 중요한 것은 DG 체계에서 흑백 계열의 색상 이외의 색상들이 포함된 그림이 표출된 그래픽 창을 캡쳐할 때 TVRD()만으로든 색상들이 제대로 반영되지 않는다는 것입니다. 물론 해결 방법은 있습니다. TVRD 함수를 사용할 때 /TRUE 키워드를 함께 사용하는 것입니다. 즉 다음과 같은 방식으로 하면 됩니다.
cap = TVRD(/TRUE)
HELP, cap
WINDOW, 1, XSIZE=600, YSIZE=500
TV, cap
위와 같이 TVRD 함수를 /TRUE 키워드와 함께 사용하여 캡쳐를 하고, 캡쳐된 이미지를 별도의 그래픽 창에 표출합니다. 그 모습은 다음과 같습니다.
일단 결과부터 보면 원래 그림이 지니고 있던 색상들이 캡쳐 이미지에서도 제대로 반영되었음을 확인할 수 있습니다. 이와 같이 TVRD 함수에서 /TRUE 키워드를 사용하면 캡쳐된 이미지는 24비트 RGB 이미지로 획득됩니다. 이것은 HELP에 의하여 출력된 내용을 보면 알 수 있습니다.
CAP BYTE = Array[3, 600, 500]
이와 같이 cap은 3x600x500의 구조를 갖는 배열로 얻어지는데, 그래픽 창의 내용을 24비트 RGB 이미지로 캡쳐했다는 의미입니다. 따라서 그래픽 창에 표출된 그림이 흑백 계열의 색상들 뿐 아니라 그 외의 다양한 색상들로 구성된 경우에는 그래픽 창을 캡쳐하는데 있어서 TVRD 함수를 /TRUE 키워드와 함께 사용하면 24비트 RGB 이미지로 캡쳐되면서 원래의 색상들이 제대로 반영된다는 점을 반드시 유념해야 합니다. 그리고 이와 같이 RGB 이미지로 캡쳐된 배열 cap은 그림 파일로 저장할 때 바로 사용할 수 있습니다. 예를 들어 PNG 파일로 저장할 경우에는 다음과 같이 WRITE_PNG 명령에 인수로 투입합니다.
WRITE_PNG, 'my_figure.png', cap
이와 같은 방법으로 저장된 png 파일의 모습은 다음과 같습니다.
그런데 이렇게 24비트 RGB 이미지로 캡쳐된 배열 cap을 의도적으로 8비트 이미지 배열로 변환해야 하는 경우가 간혹 있습니다. 대표적인 예가 바로 GIF 파일로 저장하는 경우입니다. 왜냐하면 GIF라는 포맷 자체가 8비트 이미지만 받을 수 있기 때문입니다. 따라서 이러한 경우에는 다음과 같이 COLOR_QUAN 함수를 별도로 사용하여 24비트 이미지 배열을 8비트 이미지 배열로 변환하고 그 결과 배열을 WRITE_GIF 명령에 투입해야 합니다.
capr = COLOR_QUAN(cap, 1, r, g, b)
WRITE_GIF, 'my_figure.gif', capr, r, g, b
이러한 처리법은 얼마전에 올렸던 애니메이션 GIF 파일을 만드는 방법에 관한 게시물에서도 관련 설명과 함께 소개되어 있으므로 함께 참조하시면 됩니다. 이와 같은 방법으로 저장된 gif 파일의 모습은 다음과 같습니다.
어쨌거나 DG 체계에서 그림이 표출된 그래픽 창의 내용을 캡쳐하기 위하여 TVRD 함수를 사용하는데 있어서 중요한 사항들을 대략 다음과 같이 정리해볼 수 있습니다.
(1) 흑백 계열의 색상들 즉 0번 컬러테이블의 색상들로만 구성된 그림이 표출된 그래픽 창을 캡쳐할 경우에는 TVRD()만으로 캡쳐해도 무방하다.
(2) 흑백 계열의 색상들 이외의 다른 색상들이 사용된 그림이 표출된 그래픽 창을 캡쳐할 경우에는 TVRD()만으로 캡쳐하면 색상들이 제대로 반영되지 않으므로 반드시 TVRD(/TRUE)를 사용하여 24비트 RGB 이미지로 캡쳐하는 것이 바람직하다.
(3) OS가 윈도우즈가 아닌 경우 즉 Mac OS, 리눅스 등과 같은 OS를 사용하는 머신에서는 WINDOW 프로시저로 그래픽 창을 띄울 때 RETAIN 키워드의 값을 2로 설정하는 것이 필요할 수도 있음을 유의한다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > Direct Graphics' 카테고리의 다른 글
플롯(Plot) 상에 축과 데이터 추가하기 (DG 체계) (0) | 2024.10.30 |
---|---|
특정 화소들만 강조한 이미지의 표출 (DG 체계) (0) | 2024.06.17 |
DG 체계에서 여백의 설정 방법 (0) | 2024.04.09 |
DG 체계에서 지도와 이미지 중첩 표출 [4] (2) | 2023.09.25 |
DG 체계에서 컬러바를 직접 제작하기 (2) | 2023.09.18 |