IDL/Object Graphics

Object Graphics in IDL [26]

이상우_idl 2011. 2. 22. 15:37
728x90
반응형

팔레트 객체(Palette Object)의 사용


팔레트 객체는 IDLgrPalette 클래스에 해당되며 인덱스 컬러모델에서 컬러테이블을 사용하기 위하여 종종 이용된다. 이는 마치 Direct Graphics에서 흔히 사용하던 LOADCT나 TVLCT와 비슷한 역할을 한다고 보면 된다. 기본적인 사용법은 바로 위에서 언급이 이미 되었지만, 이 팔레트 객체는 그래픽 디바이스 객체뿐만 아니라 개별 하위 그래픽 객체에 대해서도 적용이 가능하다는 점을 추가적으로 유념할 필요가 있다. 예를 들면, 다음과 같이 이미지 객체에 대해서 개별적으로 팔레트 객체를 지정할 수 있다.

myImage = OBJ_NEW(‘IDLgrImage’, $

  BYTSCL(HANNING(400, 400)))

myImage -> SetProperty, PALETTE=myPalette

그런데 여기서 주의할 점은 하위 그래픽 객체에 개별적으로 부여된 팔레트가 제 역할을 하려면 그래픽 디바이스 객체가 RGB 컬러모델이어야 한다는 것이다. 만약 그래픽 디바이스 객체가 인덱스 컬러모델을 사용한다면, 여기에 부여된 팔레트가 무조건 사용된다. 설명이 좀 어려운 것 같은데, 다음 예제를 살펴보자.

myWindow = OBJ_NEW(‘IDLgrWindow’, COLOR_MODEL=1)

myPalette1 = OBJ_NEW(‘IDLgrPalette’)

myPalette1 -> LOADCT, 5

myWindow -> SetProperty, PALETTE=myPalette1

여기서 생성한 myWindow라는 윈도우 객체는 인덱스 컬러모델을 따르며 5번 컬러테이블에 해당되는 팔레트 객체를 속성으로 갖는다. 이제 이미지 객체를 하나 생성하여 이를 나중에 myWindow에서 표출할 것이라고 하자.

myImage = OBJ_NEW(‘IDLgrImage’, $

  BYTSCL(HANNING(400, 400)))

myPalette2 = OBJ_NEW(‘IDLgrPalette’)

myPalette2 -> LOADCT, 39

myImage -> SetProperty, PALETTE=myPalette2

이제 여기서 myImage 객체의 색상은 과연 어떤 컬러테이블에 근거하여 나타날 것인가를 생각해보자. 아마 이런 프로그램을 만든 저자는 39번 컬러테이블을 사용하고자했을 가능성이 높겠지만, 실제로는 5번 컬러테이블 기반의 색상으로 구현될 것이다. 왜냐하면 윈도우 객체의 팔레트 속성을 우선적으로 따르기 때문이다. 따라서 팔레트 객체의 사용에 있어서 그래픽 디바이스 및 개별 하위 그래픽 객체에 대한 팔레트 설정은 세심한 주의가 필요하다.

사실 이러한 문제는 애초에 그래픽 디바이스 객체의 컬러모델을 RGB로 설정해서(기본설정) 사용하면 다 해결된다. 앞 페이지의 각주에서 언급했지만, 그래픽 디바이스 객체에 대하여 인덱스 컬러모델로 설정하는 것이 어떤 디스플레이 시스템에서는 아예 불가능한 경우도 있으므로, 그냥 그래픽 디바이스 객체에 대해서는 무조건 RGB 컬러모델을 쓴다고 생각해버리는 편이 오히려 더 나을 것이다. 특히 플랫폼에 상관없이 어떤 시스템에서나 정상적으로 구동되어야하는 프로그램을 만들 경우라면 더욱 그렇다. 여기서 등장할 많은 예제들도 결국 그러한 설정을 사용하는 경우가 대부분일 것이다. 다음 두 그림의 경우도 윈도우 객체가 RGB 컬러모델을 따르도록 되어있는 상태에서, 이미지 객체는 5번 및 3번 컬러테이블에 해당되는 팔레트 객체가 그 속성으로 부여된 경우를 나타낸다. 이 두 그림을 구현하기 위한 예제 코드는 아래와 같다.




PRO test_obj_color


oWindow1 = OBJ_NEW('IDLgrWindow', DIMENSION=[400, 400])

oWindow2 = OBJ_NEW('IDLgrWindow', DIMENSION=[400, 400])

oView1 = OBJ_NEW('IDLgrView', VIEWPLANE_RECT=[0, 0, 400, 400])

oView2 = OBJ_NEW('IDLgrView', VIEWPLANE_RECT=[0, 0, 400, 400])

oModel1 = OBJ_NEW('IDLgrModel')

oModel2 = OBJ_NEW('IDLgrModel')


oImage1 = OBJ_NEW('IDLgrImage', BYTSCL(HANNING(400, 400)))

oImage2 = OBJ_NEW('IDLgrImage', BYTSCL(HANNING(400, 400)))

oPalette1 = OBJ_NEW('IDLgrPalette')

oPalette1 -> LOADCT, 5

oPalette2 = OBJ_NEW('IDLgrPalette')

oPalette2 -> LOADCT, 3


oImage1 -> SetProperty, PALETTE=oPalette1

oImage2 -> SetProperty, PALETTE=oPalette2

oModel1 -> Add, oImage1

oModel2 -> Add, oImage2

oView1 -> Add, oModel1

oView2 -> Add, oModel2


oWindow1 -> Draw, oView1

oWindow2 -> Draw, oView2


END

반응형

'IDL > Object Graphics' 카테고리의 다른 글

Object Graphics in IDL [28]  (0) 2011.03.06
Object Graphics in IDL [27]  (0) 2011.02.25
Object Graphics in IDL [25]  (0) 2011.02.14
IDL 8.0에서 새로 도입된 Object 관련 문법  (0) 2011.02.07
Object Graphics in IDL [24]  (0) 2011.02.05