IDL/New Graphics

IDL 9.0의 그림 저장 문제에 관하여 [1]

이상우_idl 2024. 5. 29. 15:50
728x90
반응형

오늘은 IDL 9.0에서 보고되고 있는 알려진 문제 하나에 관하여 언급을 해보고자 합니다. 이 문제는 IDL 9.0에서 NG 체계에서 그래픽 요소들이 중첩되어 표출된 그림을 파일로 저장할 때 발생하는 문제인데요. 먼저 예제 그림을 다음과 같이 표출해봅시다.

 

x = FINDGEN(101)
y = SQRT(x) + RANDOMU(-1, 101) * 2 - 1
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, THICK=2, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
sym = SYMBOL(40, 6.8, 'circle', /SYM_FILLED, SYM_FILL_COLOR='tomato', SYM_SIZE=6, /DATA)

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

 

여기서는 먼저 PLOT 함수를 사용하여 플롯을 그린 상태에서 SYMBOL 함수를 사용하여 색상이 채워진 원형 심볼을 중첩한 것입니다. 그리고 이 표출 결과를 PNG 파일로 저장하게 됩니다. IDL 9.0에서 이러한 과정을 실행하여 PNG 파일을 얻어보면 그 모습은 다음과 같습니다.

 

이 그림에서 뭔가 이상한 점이 보이시나요? 원형 심볼을 잘 보면 심볼 내부에서도 플롯의 라인이 잘 보입니다. 위의 예제 코드를 보면 분명히 플롯을 먼저 표출하고 심볼을 나중에 중첩하였습니다. 그리고 이 심볼은 색상이 채워진 것이기 때문에 이 심볼 위로는 플롯 라인이 보이지 않아야 합니다. 하지만 PNG 파일로 저장된 그림에서는 플롯 라인이 심볼 내부에서도 그대로 보인다는 것이 문제입니다. 물론 위의 예제 코드를 실행하여 이 그림이 표출되는 IDL 자체의 그래픽 창에서는 정상적으로 보일 수도 있지만, 최종적으로 저장된 그림 파일의 모습은 위와 같습니다. 참고로 위의 그림은 제가 윈도우즈용 IDL 9.0의 설정(Preference)에서 IDL->그래픽 섹션의 "개체 그래픽의 렌더링 방법"이라는 항목을 하드웨어로 설정한 상태에서 코드를 실행하여 PNG 파일로 저장한 것입니다. 이 항목을 소프트웨어로 설정하거나 아니면 다른 OS의 IDL 9.0(예를 들면 Mac OS용 IDL 9.0)에서 테스트해본 결과도 마찬가지입니다. 비교를 위하여 위의 예제 코드를 그대로 IDL 8.9에서 실행해보면 그 결과로 얻게 되는 PNG 파일의 모습은 다음과 같습니다.

 

이와 같이 나중에 표시된 심볼 위로는 플롯 라인이 보이지 않습니다. 원래는 이와 같은 모습으로 저장되는 것이 정상입니다. 따라서 이러한 증상을 정리해본다면, IDL 9.0에서 NG 체계에서 그래픽 요소들이 중첩된 그림을 표출한 후 비트맵 형식의 그림 파일(PNG, JPG 등등)으로 저장할 경우에는 나중에 중첩된 그래픽 요소들이 이전에 표출된 그래픽 요소들을 덮어씌우지 못하는 상태가 된다는 것으로 요약할 수 있습니다. 다만 비트맵 형식이 아닌 벡터 형식(PDF, PS 등)의 파일로 저장할 경우에는 이러한 문제가 발생하지 않습니다. 위의 예제 코드에서 마지막 줄만 다음과 같이 PDF 파일로 저장하는 내용으로 수정하여 IDL 9.0에서 다시 실행해보면 확인이 가능합니다.

 

win.Save, 'symbol_overlay.pdf'

 

이렇게 얻어본 PDF 파일을 아래에 첨부합니다. 열어서 보면 위와 같은 문제는 발생하지 않았음을 확인할 수 있습니다.

symbol_overlay.pdf
0.07MB

 

일단 이 문제는 IDL 본사인 NV5 Geospatial에서도 이미 인지하고 있으며, 가급적이면 차기 버전(아마도 9.1)에서 해결될 수 있도록 최선을 다하겠다는 것이 본사의 입장입니다. 다만 현 시점 기준으로 다른 대안이 있느냐가 궁금한데, 제가 본사로부터 안내받은 대안이 하나 있긴 합니다. 일단 그 내용을 소개하면 그림 파일로 저장하는 과정을 다음과 같은 내용으로 대체하는 것입니다.

 

tmp = win.READ()
tmp.GetProperty, DATA=cap
WRITE_PNG, 'symbol_overlay_alt.png', cap

 

IDL 9.0에서 이와 같은 방식으로 저장된 PNG 파일의 모습은 다음과 같습니다. 다만 IDL 9.0에서 이러한 방식으로 그림을 저장하게 될 경우에는 앞서 언급한 "개체 그래픽의 렌더링 방법"이라는 항목을 하드웨어 대신 소프트웨어로 설정하는 것이 필요할 수도 있다는 점을 유의하면 좋을 것 같습니다.

 

일단 이 그림을 보면 그래픽 요소의 중첩 문제는 존재하지 않는다는 점에서는 긍정적입니다. 다만 그림 파일의 용량을 확인해보면 이전에 비하여 현저하게 줄어든 것을 확인할 수 있습니다. 즉 품질(Quality)이 하향된 상태라고 보면 됩니다. 사실 위와 같이 플롯과 심볼 정도로만 구성된 그림에서는 그리 티가 나지는 않지만, 이미지나 등위선 등과 같이 복잡한 그래픽 요소들이 다수 존재하는 그림의 경우라면 그 차이가 제법 느껴질 수도 있습니다. 물론 이러한 차이가 그리 현저하게 느껴지지 않을 경우에는 위의 대안을 사용하는 것도 나쁘지 않을 것입니다. 하지만 위의 대안으로 얻은 결과물이 불만족스럽게 느껴질 경우에는 사실 또 다른 대안은 마땅치가 않습니다. 그럴 경우에는 임시로 IDL 8.9와 같이 9.0 이전 버전의 IDL로 잠시 돌아가는 것이 더 나을 수도 있습니다.

 

어쨌든 현재 IDL 9.0에서는 이러한 문제가 존재하며, 저도 유저의 한 사람으로서 이 문제가 조속히 해결되었으면 하는 바램에서 이러한 내용을 공유해봅니다.

반응형