The easiest way to think about the rescaling is through four ranges
(maximum-minimum pairs). In the file variable, values have a
valid range var_vrange and these correspond to real values
var_imgrange. The user/application wants to convert real values
usr_imgrange to a useful valid range usr_vrange. From
var_vrange, var_imgrange, usr_imgrange and
usr_vrange, we can determine a scale and offset for converting
pixel values: Input values are scaled to real values by
var_vrange to var_imgrange and then scaled again to user
values by usr_imgrange to usr_vrange.
If either of the vrange variables are not specified, they default to
maximum possible range for integer types. For floating
point types, usr_vrange is set equal to usr_imgrange
so that no conversion of real values is done.
If normalization is not being done, then for integer types
var_imgrange and usr_imgrange are set to [0,1] (scale
down to [0,1] and scale up again). When normalizibng,
usr_imgrange is set to either the full range of the variable
([0,1] if not found) or the user's requested range. If the variable
values are floating point, then var_imgrange is set to
var_vrange (no scaling to real values), otherwise
var_imgrange is read for each image (again, [0,1] if not
found).
What this means for reading and writing images is discussed below.