IDL/Direct Graphics

색상 이름을 RGB로 변환하여 사용하기

이상우_IDL 2023. 2. 23. 15:21
728x90

이미 많이들 알고계시겠지만, IDL의 NG 체계에서는 색상을 이름으로 지정하여 사용할 수 있습니다. 예를 들어 파란색의 경우에는 'blue'라는 문자값으로 정의됩니다. 물론 그 외에도 여러가지 색상들이 있는데 그 중 'hot_pink'라는 색상도 있습니다. 어쨌든 원하는 색상을 사용하고자 할 경우에는 다음과 같이 이름을 그대로 사용하면 됩니다.

 

p = PLOT(x, y, COLOR='hot_pink')

 

IDL에서는 이와 같이 이름으로 지정 가능한 색상들이 총 147종입니다. 이와 관련된 구체적인 정보는 다음과 같이 시스템 변수 !COLOR로부터 확인이 가능합니다.

 

PRINT, N_TAGS(!COLOR)

PRINT, !COLOR

 

그런데 이와 같이 이름으로 정의되어있는 색상에 대한 RGB 값을 가져오는 것이 필요할 경우가 있습니다. 즉 'hot_pink'라는 색상에 대한 RGB 값은 [255, 105, 180]인데, 'hot_pink'라는 이름 대신 [255, 105, 180]이라는 RGB 값이 필요한 경우입니다. 사실 NG 체계에서는 색상을 지정할 때 이름 및 RGB를 둘 다 지원하기 때문에 이러한 변환이 굳이 필요하지는 않습니다. 즉 다음과 같이 두가지 방법이 다 허용됩니다.

 

p = PLOT(x, y, COLOR='hot_pink')

p = PLOT(x, y, COLOR=[255, 105, 180])

 

하지만 DG 체계에서는 색상을 이름으로 지정할 수가 없다는 특성 때문에 이러한 변환이 필요할 수 있습니다. 그러면 일단 변환 과정부터 먼저 보겠습니다.

 

clr = 'hot_pink'
cnames = TAG_NAMES(!color)
ww = WHERE(STRMATCH(cnames, clr, /FOLD_CASE) EQ 1)
rgb = !color.(ww)
HELP, rgb
PRINT, rgb

 

이와 같이 147종의 색상 이름 문자값들로 구성된 cnames라는 배열을 얻은 다음 여기서 내가 원하는 이름을 찾아서 그 정보를 가져오는 것입니다. 출력된 결과를 보면 다음과 같습니다.

 

RGB             BYTE      = Array[3]
 255 105 180

 

따라서 위의 과정에서 내가 원하는 색상 이름을 변수 clr에 지정해주기만 하면 해당되는 RGB 값을 가져올 수 있습니다. 그러면 간단한 표출과 함께 이 색상 정보를 활용해봅시다. 먼저 NG 체계에서 예제 플롯을 표출하는 과정 및 그 결과는 다음과 같습니다.

 

n = 100
x = FINDGEN(n)
y = SIN(2.0*x*!PI/25.0)*EXP(-0.02*x)
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, COLOR=rgb, THICK=3, FONT_SIZE=11, MARGIN=0.1, /CURRENT)

 

 

여기서 PLOT 함수의 내용을 보면 COLOR 속성에 대하여 rgb를 부여하였습니다. 물론 NG 체계에서는 색상 이름을 바로 사용해도 됩니다. 즉 다음과 같이 해도 결과는 똑같습니다.

 

p = PLOT(x, y, COLOR='hot_pink', THICK=3, FONT_SIZE=11, MARGIN=0.1, /CURRENT)

 

그러면 이제 DG 체계로 넘어가봅시다. DG 체계에서 RGB 색상을 사용하는 방법에 관해서는 제가 예전에 관련 게시물을 올린 바 있습니다. 여기서도 언급했듯이 DG 체계에서는 색상을 'hot_pink'라는 이름으로 지정하는 것 뿐만 아니라 RGB 값배열인 [255, 105, 180]을 바로 사용하는 것도 허용되지 않습니다. 물론 방법은 있습니다. RGB 값을 24비트의 긴 정수(Long Integer)로 변환하여 사용하는 것입니다. 그 과정은 다음과 같습니다.

 

rgb_num = rgb[0]+(rgb[1]*2L^8)+(rgb[2]*2L^16)

HELP, rgb_num
PRINT, rgb_num

 

이와 같이 변환된 rgb_num에 관하여 출력된 정보는 다음과 같습니다.

 

RGB_NUM         LONG      =     11823615
    11823615

 

즉 rgb_num은 자료형이 긴 정수(Long Integer)에 해당되며 그 값은 11823615입니다. 원래 RGB 색상의 red, green, blue 각각의 값은 8비트인데 이 셋을 합성하여 24비트 짜리 긴 정수형의 값으로 환산한 것이며, 그 값을 담은 변수 rgb_num을 그대로 사용하면 됩니다. 그러면 앞서 표출했던 것과 동일한 형태의 플롯을 DG 체계에서 표출하면서 이 색상을 사용해봅시다. 그 과정은 다음과 같습니다.

 

DEVICE, DECOMPOSED=1

WINDOW, XSIZE=600, YSIZE=500
PLOT, x, y, COLOR=0, BACKGROUND=255+(255*2L^8)+(255*2L^16), $
  CHARSIZE=1.4, POSITION=[0.1, 0.1, 0.9, 0.9]
OPLOT, x, y, COLOR=rgb_num, THICK=3

 

여기서는 일단 PLOT 프로시저를 사용하여 흰색 배경에 검정색 플롯을 먼저 표출한 다음 OPLOT 프로시저를 사용하여 'hot_pink' 색상의 데이터 플롯 라인을 추가하였습니다. 즉 OPLOT 프로시저의 COLOR 키워드에 rgb_num이 부여된 것을 먼저 주목해야 합니다. 그리고 그 이전에 PLOT 프로시저가 사용된 내용을 보면 BACKGROUND 키워드에는 흰색의 RGB 값 [255, 255, 255]에 해당되는 24비트 긴 정수 값이 부여되었고, COLOR 키워드에는 검정색의 RGB 값 [0, 0, 0]에 대한 24비트 긴 정수 값인 0이 부여되었습니다. 실제 표출 결과를 보면 다음과 같습니다.

 

 

이와 같이 DG 체계에서는 원하는 색상에 대한 RGB 값을 먼저 얻은 다음에 위와 같이 24비트 긴 정수 값으로의 변환을 통해서 그 색상을 바로 사용할 수 있습니다. 사실 앞서 언급한 관련 게시물에서는 DG 체계에서 RGB 색상을 사용하는 방법이 다음과 같이 RGB 값에 대응되는 16진수를 산출한 후 다음과 같이 직접 적어주는 것 뿐이라고 제가 언급을 했었습니다.

 

OPLOT, x, y, COLOR='B469FF'x, THICK=3

 

이 방식의 경우는 RGB 값에 대응되는 16진수 값을 따로 기억했다가 따옴표 안에 다시 적어줘야 하는 불편함이 있는 것이 사실입니다. 하지만 오늘 소개한 방법을 적용하면 색상의 RGB 값을 24비트 긴 정수형의 값으로 환산하여 바로 투입하여 사용할 수 있기 때문에 프로그래밍적으로도 더 편리하다는 점을 염두에 두시면 좋을 것 같습니다.

LIST