No rating

# Determining the color table index from a color table array

Mark Piper

Today I'd like to show something I encountered recently that's not terribly important, but that I found interesting.

In IDL 8 (a.k.a. New) Graphics, the RGB_TABLE property can take as input a color table index, an integer on 0-74. Internally, the color information is converted to a color table array, a 3 x 256 byte array. For example, here I display a distance map (with the DIST function) as an image with color table 70:

```IDL> g = image(dist(400), rgb_table=70)
```

When I retrieve the color table, it's been converted into a color table array:

```IDL> help, g.rgb_table
<Expression>    BYTE      = Array[3, 256]
```

What if I'd like to get back the color table index, 70? Here's a program that attempts to solve this problem:

```; docformat = 'rst'
;+
; Attempts to determine which built-in color table matches an input [256,3]
; or [3,256] array of colors.
;
; :params:
;  rgb_table: in, required, type=byte
;   A [256,3] or [3,256] byte array of color table values.
;
; :returns:
;  The color table index if matched, else the input is passed through unchanged.
;
; :requires:
;  IDL 8.2.1
;
; :author:
;  Mark Piper, VIS, 2013
;-
function determine_colortable, rgb_table
compile_opt idl2, hidden
on_error, 2

do_transpose = (size(rgb_table, /dimensions)) eq 3

!null = colortable(get_names=all_ct_names)
for ct_index=0, n_elements(all_ct_names)-1 do begin
ct_array = colortable(ct_index, transpose=do_transpose)
if array_equal(rgb_table, ct_array) then return, ct_index
endfor

return, rgb_table ; pass through
end
```

The key is the use of the COLORTABLE function, introduced in IDL 8.2.1. Use DETERMINE_COLORTABLE (I couldn't think of a better name) to determine the color table used in the graphic "g" above:

```IDL> print, determine_colortable(g.rgb_table)
70
```

The idea for this program came from a discussion with Eddie Haskell on the IDL Engineering team.