Determining the color table index from a color table array
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
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.
; rgb_table: in, required, type=byte
; A [256,3] or [3,256] byte array of color table values.
; The color table index if matched, else the input is passed through unchanged.
; IDL 8.2.1
; Mark Piper, VIS, 2013
function determine_colortable, rgb_table
compile_opt idl2, hidden
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
return, rgb_table ; pass through
The key is the use of
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)
The idea for this program came from a discussion with Eddie
Haskell on the IDL Engineering team.