[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: changing contrast and brightness on the fly

"Liam E. Gumley" wrote:
> JD Smith wrote:
> > A standard feature of astronomical viewers.  For a solution which uses
> > only colormap fiddling (vs. full image rescaling), see atv:
> >
> >  http://cfa-www.harvard.edu/~abarth/atv/atv.html
> >
> > This brings up the age old question of how best to dynamically redisplay
> > images (brightnest/contrast/etc.).  With only 255 colors, making the top
> > 100 white to increase brightness is pretty wasteful, and cuts down on
> > the dynamic visual range... much better (and slower) is to rescale the
> > image range of interest into the full colormap.
> >
> > Here's how Andrew (and cohorts) did it:
> >
> > +++++++++++++++++++++++++++++++++++++++++++
> > pro atv_stretchct, brightness, contrast,  getmouse = getmouse
> >
> > ; routine to change color stretch for given values of
> > ; brightness and contrast.
> > ; Complete rewrite 2000-Sep-21 - Doug Finkbeiner
> > ; This routine is now shorter and easier to understand.
> >
> > common atv_state
> > common atv_color
> >
> > ; if GETMOUSE then assume mouse positoin passed; otherwise ignore
> > ; inputs
> >
> > if (keyword_set(getmouse)) then begin
> >    state.brightness = brightness/float(state.draw_window_size[0])
> >    state.contrast = contrast/float(state.draw_window_size[1])
> > endif
> >
> > x = state.brightness*(state.ncolors-1)
> > y = state.contrast*(state.ncolors-1) > 2   ; Minor change by AJB
> > high = x+y & low = x-y
> > diff = (high-low) > 1
> >
> > slope = float(state.ncolors-1)/diff ;Scale to range of 0 : nc-1
> > intercept = -slope*low
> > p = long(findgen(state.ncolors)*slope+intercept) ;subscripts to select
> > tvlct, r_vector[p], g_vector[p], b_vector[p], 8
> >
> > end
> > +++++++++++++++++++++++++++++++++++++++++++
> Is it fair to say that this method will only give satisfactory results
> when IDL is running in 8-bit display mode?

Umm, not necessarily.  ATV for instance just issues a redisplay if
you're using 24 bit color.  The actual breakdown I've discovered (please
correct any errors) is:

Psuedo-Color: Shared colormap (usally 8bit), no redisplay necessary. 
The hardware colormap is read-writeable.

Direct-Color: One large colormap for each of R/G/B, no redisplay
necessary.   The hardware colormap is read-writeable.

True-Color: No real colormap, colors are expressed in absolute terms. 
Redisplay necessary (which will usually be fairly much slower than
direct manipulation of the hardware color table).   IDL will maintain a
software translation colormap for you, with decomposed=0.  A linear ramp
of RGB colors is presumed, and you can't change this directly (the
hardware colormaps is read only).

Some machines (usually commercial unices) support multiple visuals at
once, a capability termed "overlays".  In this case, you can say
device,PSUEDO=8, and be up and running, able to write the underlying
hardware colormap for fast color-changing.  On the PC side, typically
you only have one visual class available at a time (and this includes

The pros and cons are:

1.  TrueColor:  

Pros: Millions of colors, and straightforward to get exactly the color
you want, since noone can muck with the underlying colormap (a linear
ramp in R,G, and B space)

Cons: Read-only colormap, requiring slow redraws and software-only color
translation for normal color table operation.

2.  PsuedoColor:

Pros: Lightening fast color manipulation, since you're just loading a
table into the display hardware.  No redisplay required.

Cons:  Usually only 255 colors.  Colormap flashing may result (even with
IDL widgets... yuck).  This is not a problem for overlayed PsuedoColor
visuals (which get their own little 8-bit colorspace to play in). 
Overlays have limited availability.

3.  DirectColor:

Pros:  Colormaps can be fiddled, separately for RGB.  Redisplay probably
*not* required.

Cons:  Not as fast at color operations as Psuedo-color.  It's quite
possible that when using the DECOMPOSED=0 flag with DirectColor, IDL
performs the exact same color translation as for TrueColor (though it
doesn't need to), and then sets the hardware colormap.