IDL에서 컬러의 값을 설정하는데 있어서 최근에 많이 이용되는 NG(New Graphics) 체계에서는 컬러의 영문 이름을 직접 사용하는 경우가 많습니다. 예를 들어 NG에서 플롯(Plot)을 표출할 때 플롯 선의 색상을 진홍색(Crimson)으로 처리하여 그리고자 할 경우에는 다음과 같이 합니다.
p = PLOT(SQRT(FINDGEN(101)), COLOR='crimson')
그런데 이러한 색상은 원래는 고유의 RGB값이 있습니다. 이 Crimson 색상의 경우에는 [220, 20, 60]입니다. 따라서 위의 내용은 다음과 같이 표현해도 결과는 똑같습니다.
p = PLOT(SQRT(FINDGEN(101)), COLOR=[220, 20, 60])
그런데 지금 예로 들고 있는 Crimson 색상외에도 IDL에서는 이와 같이 명칭이 붙은 색상들이 총 147종이 지원됩니다. 그래서 이러한 색상들에 대한 총괄적인 정보가 필요할 수가 있습니다. 이를 확인하는 방법은 두가지 정도가 있는데요. 먼저 IDL 도움말에서 관련 정보를 찾아보는 것입니다. IDL 도움말에서 왼쪽 부분을 보면 'Contents'와 'Index'라는 탭이 있는데, 다음 캡쳐화면과 같이 'Index'라는 탭을 누르고 검색창에서 !color라는 항목을 선택하면 됩니다. 그러면 오른쪽 부분에서 자세한 정보들을 확인할 수 있습니다. 이 내용은 IDL의 시스템 변수들 중 하나인 !color에 관한 세부적인 사항들입니다.
이 내용을 보면 IDL에서 명칭으로 지원되는 총 147종의 각 컬러의 명칭 및 RGB 색상값들을 일목요연하게 확인할 수 있습니다. 이와 같이 도움말에서 관련 내용을 직접 찾아서 보는 것이 가능합니다. 그리고 이러한 정보를 눈으로 확인하는데서 그치지 않고 IDL상에서 직접 추출하여 이용하는 것도 가능합니다. 바로 위에서도 언급된 !color라는 시스템 변수에 담긴 정보들을 추출하는 방식입니다. 이 !color에 관한 세부 정보를 보기 위하여 다음과 같이 HELP 명령을 사용해보면 여러 줄에 걸쳐서 많은 내용들이 출력되는 것을 볼 수 있습니다. HELP로 출력된 내용들 중 앞부분 일부만 보면 다음과 같습니다.
IDL> HELP, !color
** Structure !COLOR, 147 tags, length=441, data length=441:
ALICE_BLUE BYTE Array[3]
ANTIQUE_WHITE BYTE Array[3]
AQUA BYTE Array[3]
AQUAMARINE BYTE Array[3]
AZURE BYTE Array[3]
BEIGE BYTE Array[3]
BISQUE BYTE Array[3]
BLACK BYTE Array[3]
사실 !color의 실체는 147개의 태그 정보들을 담고 있는 구조체(Structure)입니다. 구조체라는 것은 정보들의 집합체와 같은 것인데 그 개념을 여기서 자세히 다루기는 힘들 것 같습니다. 다만 태그(Tag)라는 것은 구조체가 포함하고 있는 정보들 하나하나의 꼬리표같은 것이라고 보면 됩니다. 위의 내용을 자세히 보면 태그에 해당되는 항목들이 바로 각 색상의 명칭임을 알 수 있습니다. 그리고 각 태그마다 3개의 값을 담은 배열이 연동되어 있는데 이것이 바로 각 색상에 대한 RGB 값들에 해당됩니다. 따라서 !color라는 구조체로부터 세부적인 정보를 추출하려면 구조체(Structure)의 정보를 조회하는 관련 함수 및 문법이 필요합니다. 먼저 태그들의 갯수는 다음과 같이 확인합니다.
IDL> PRINT, N_TAGS(!color)
147
그리고 각 항목별로 RGB값을 가져오려면 다음과 같이 합니다. 예를 들어 앞서 사용했던 Crimson 색상의 RGB값들을 확인하는 방법은 다음과 같습니다.
IDL> PRINT, !color.crimson
220 20 60
따라서 앞에서 사용했던 예제 명령은 다음과 같이 사용해도 됩니다.
p = PLOT(SQRT(FINDGEN(101)), COLOR=!color.crimson)
그리고 147종의 색상 명칭들만 따로 추출하여 문자값 배열로 만드는 것도 가능합니다. 다음과 같이 TAG_NAMES 함수를 사용하면 됩니다.
IDL> cn = TAG_NAMES(!color)
IDL> HELP, cn
CN STRING = Array[147]
IDL> PRINT, cn[19]
CRIMSON
이와 같이 Crimson 색상은 147개의 색상들 중 19번 인덱스(20번째)에 해당됩니다. 이렇게 색상의 인덱스를 알면 다음과 같이 구조체에 대하여 인덱스를 통하여 RGB값을 추출하는 것도 가능합니다.
IDL> PRINT, !color.(19)
220 20 60
그리고 바로 앞서서 TAG_NAMES 함수로 얻은 색상명칭값 배열인 cn은 여러가지 방식으로 활용할 수 있습니다. 하나만 예를 들어보면, 147종의 색상들 중에서 파란색 계열의 색상들만 뽑아내는 것도 가능합니다. 이러한 색상들은 그 이름 내에 무조건 'BLUE'라는 문자열이 포함되어 있다는 점에 착안하여 다음과 같이 WHERE, STRMATCH 함수를 활용할 수 있습니다.
IDL> ww = WHERE(STRMATCH(cn, '*BLUE*') EQ 1, count)
IDL> HELP, ww
WW LONG = Array[19]
IDL> PRINT, count
19
그러면 이와 같이 파란색 계열의 색상들이 총 19개가 있음을 확인할 수 있습니다. 19개의 각 색상들의 명칭 및 인덱스들을 다음과 같이 반복문을 사용하여 출력할 수 있습니다.
IDL> FOR j=0,count-1 DO PRINT, cn[ww[j]], ww[j]
ALICE_BLUE 0
BLUE 9
BLUE_VIOLET 10
CADET_BLUE 13
DARK_BLUE 21
DARK_SLATE_BLUE 35
DEEP_SKY_BLUE 41
DODGER_BLUE 44
LIGHT_BLUE 67
LIGHT_SKY_BLUE 77
LIGHT_STEEL_BLUE 80
MEDIUM_BLUE 88
MEDIUM_SLATE_BLUE 92
MIDNIGHT_BLUE 96
POWDER_BLUE 117
ROYAL_BLUE 121
SKY_BLUE 129
SLATE_BLUE 130
STEEL_BLUE 135
이들 색상들 중 Sky Blue라는 색상에 대한 RGB값들은 다음과 같이 알아낼 수 있습니다.
IDL> PRINT, !color.sky_blue
135 206 235
IDL> PRINT, !color.(129)
135 206 235
그래서 오늘 소개한 내용과 같은 방식으로 !color 시스템 변수에 담긴 정보들을 다양하게 활용하면 IDL에서 색상 처리에 있어서 여러가지 활용이 가능할 것이라 생각합니다.
'IDL > Miscellaneous' 카테고리의 다른 글
IDL의 lib 디렉토리에 관한 잡설 (0) | 2019.09.30 |
---|---|
IDL User Group의 Q&A 게시판의 이용에 관하여 (내용 업데이트) (0) | 2019.08.19 |
"IDL에는 pwd 명령이 없나요?" (0) | 2018.04.12 |
Mac OS 10.12.5에서 IDL 도움말이 뜨지 않는 문제 해결법 (0) | 2017.06.07 |
Windows 명령 프롬프트에서 IDL 실행을 위한 설정 방법 (0) | 2017.05.25 |