Class ColorSpace.Rgb
- Enclosing class:
ColorSpace
An RGB color space is an additive color space using the
RGB
color model (a color is therefore represented
by a tuple of 3 numbers).
A specific RGB color space is defined by the following properties:
- Three chromaticities of the red, green and blue primaries, which define the gamut of the color space.
- A white point chromaticity that defines the stimulus to which color space values are normalized (also just called "white").
- An opto-electronic transfer function, also called opto-electronic conversion function or often, and approximately, gamma function.
- An electro-optical transfer function, also called electo-optical conversion function or often, and approximately, gamma function.
- A range of valid RGB values (most commonly \([0..1]\)).
The most commonly used RGB color space is sRGB
.
Primaries and white point chromaticities
In this implementation, the chromaticity of the primaries and the white point of an RGB color space is defined in the CIE xyY color space. This color space separates the chromaticity of a color, the x and y components, and its luminance, the Y component. Since the primaries and the white point have full brightness, the Y component is assumed to be 1 and only the x and y components are needed to encode them.
For convenience, this implementation also allows to define the primaries and white point in the CIE XYZ space. The tristimulus XYZ values are internally converted to xyY.
Transfer functions
A transfer function is a color component conversion function, defined as a single variable, monotonic mathematical function. It is applied to each individual component of a color. They are used to perform the mapping between linear tristimulus values and non-linear electronic signal value.
The opto-electronic transfer function (OETF or OECF) encodes tristimulus values in a scene to a non-linear electronic signal value. An OETF is often expressed as a power function with an exponent between 0.38 and 0.55 (the reciprocal of 1.8 to 2.6).
The electro-optical transfer function (EOTF or EOCF) decodes a non-linear electronic signal value to a tristimulus value at the display. An EOTF is often expressed as a power function with an exponent between 1.8 and 2.6.
Transfer functions are used as a compression scheme. For instance,
linear sRGB values would normally require 11 to 12 bits of precision to
store all values that can be perceived by the human eye. When encoding
sRGB values using the appropriate OETF (see sRGB
for
an exact mathematical description of that OETF), the values can be
compressed to only 8 bits precision.
When manipulating RGB values, particularly sRGB values, it is safe to assume that these values have been encoded with the appropriate OETF (unless noted otherwise). Encoded values are often said to be in "gamma space". They are therefore defined in a non-linear space. This in turns means that any linear operation applied to these values is going to yield mathematically incorrect results (any linear interpolation such as gradient generation for instance, most image processing functions such as blurs, etc.).
To properly process encoded RGB values you must first apply the EOTF to decode the value into linear space. After processing, the RGB value must be encoded back to non-linear ("gamma") space. Here is a formal description of the process, where \(f\) is the processing function to apply:
$$RGB_{out} = OETF(f(EOTF(RGB_{in})))$$
If the transfer functions of the color space can be expressed as an
ICC parametric curve as defined in ICC.1:2004-10, the numeric parameters
can be retrieved by calling getTransferParameters()
. This can
be useful to match color spaces for instance.
Some RGB color spaces, such as ColorSpace.Named.ACES
and
scRGB
, are said to be linear because
their transfer functions are the identity function: \(f(x) = x\).
If the source and/or destination are known to be linear, it is not
necessary to invoke the transfer functions.
Range
Most RGB color spaces allow RGB values in the range \([0..1]\). There
are however a few RGB color spaces that allow much larger ranges. For
instance, scRGB
is used to manipulate the
range \([-0.5..7.5]\) while ACES
can be used throughout
the range \([-65504, 65504]\).
Converting between RGB color spaces
Conversion between two color spaces is achieved by using an intermediate color space called the profile connection space (PCS). The PCS used by this implementation is CIE XYZ. The conversion operation is defined as such:
$$RGB_{out} = OETF(T_{dst}^{-1} \cdot T_{src} \cdot EOTF(RGB_{in}))$$
Where \(T_{src}\) is the RGB to XYZ transform
of the source color space and \(T_{dst}^{-1}\) the XYZ to RGB transform
of the destination color space.
Many RGB color spaces commonly used with electronic devices use the
standard illuminant D65
. Care must be take however
when converting between two RGB color spaces if their white points do not
match. This can be achieved by either calling
ColorSpace.adapt(ColorSpace, float[])
to adapt one or both color spaces to
a single common white point. This can be achieved automatically by calling
ColorSpace.connect(ColorSpace, ColorSpace)
, which also handles
non-RGB color spaces.
To learn more about the white point adaptation process, refer to the
documentation of ColorSpace.Adaptation
.
-
Nested Class Summary
Nested classes/interfaces inherited from class icyllis.arc3d.core.ColorSpace
ColorSpace.Adaptation, ColorSpace.Connector, ColorSpace.Model, ColorSpace.Named, ColorSpace.RenderIntent, ColorSpace.Rgb
-
Field Summary
Fields inherited from class icyllis.arc3d.core.ColorSpace
ILLUMINANT_A, ILLUMINANT_B, ILLUMINANT_C, ILLUMINANT_D50, ILLUMINANT_D55, ILLUMINANT_D60, ILLUMINANT_D65, ILLUMINANT_D75, ILLUMINANT_E, MAX_ID, MIN_ID
-
Constructor Summary
ConstructorDescriptionCreates a new RGB color space using a 3x3 column-major transform matrix.Creates a new RGB color space using a specified set of primaries and a specified white point.Rgb
(String name, float[] primaries, float[] whitePoint, ColorSpace.Rgb.TransferParameters function) Creates a new RGB color space using a specified set of primaries and a specified white point.Rgb
(String name, float[] primaries, float[] whitePoint, DoubleUnaryOperator oetf, DoubleUnaryOperator eotf, float min, float max) Creates a new RGB color space using a specified set of primaries and a specified white point.Rgb
(String name, float[] toXYZ, ColorSpace.Rgb.TransferParameters function) Creates a new RGB color space using a 3x3 column-major transform matrix.Rgb
(String name, float[] toXYZ, DoubleUnaryOperator oetf, DoubleUnaryOperator eotf) Creates a new RGB color space using a 3x3 column-major transform matrix. -
Method Summary
Modifier and TypeMethodDescriptionboolean
float[]
fromLinear
(float[] v) Encodes an RGB value from linear space to this color space's "gamma space".float[]
fromLinear
(float r, float g, float b) Encodes an RGB value from linear space to this color space's "gamma space".float[]
fromXyz
(float[] v) Converts tristimulus values from the CIE XYZ space to this color space's color model.getEotf()
Returns the electro-optical transfer function (EOTF) of this color space.float[]
Returns the inverse transform of this color space as a new array.float[]
getInverseTransform
(float[] inverseTransform) Copies the inverse transform of this color space in specified array.float
getMaxValue
(int component) Returns the maximum valid value for the specified component of this color space's color model.float
getMinValue
(int component) Returns the minimum valid value for the specified component of this color space's color model.getOetf()
Returns the opto-electronic transfer function (OETF) of this color space.float[]
Returns the primaries of this color space as a new array of 6 floats.float[]
getPrimaries
(float[] primaries) Copies the primaries of this color space in specified array.Returns the parameters used by theelectro-optical
andopto-electronic
transfer functions.float[]
Returns the transform of this color space as a new array.float[]
getTransform
(float[] transform) Copies the transform of this color space in specified array.float[]
Returns the non-adapted CIE xyY white point of this color space as a new array of 2 floats.float[]
getWhitePoint
(float[] whitePoint) Copies the non-adapted CIE xyY white point of this color space in specified array.int
hashCode()
boolean
isSrgb()
Indicates whether this color space is the sRGB color space or equivalent to the sRGB color space.boolean
Returns whether this color space is a wide-gamut color space.float[]
toLinear
(float[] v) Decodes an RGB value to linear space.float[]
toLinear
(float r, float g, float b) Decodes an RGB value to linear space.float[]
toXyz
(float[] v) Converts a color value from this color space's model to tristimulus CIE XYZ values.Methods inherited from class icyllis.arc3d.core.ColorSpace
adapt, adapt, adaptToIlluminantD50, cctToXyz, chromaticAdaptation, connect, connect, connect, connect, fromXyz, get, getComponentCount, getId, getModel, getName, match, toString, toXyz
-
Constructor Details
-
Rgb
public Rgb(@Nonnull @Size(min=1L) String name, @Nonnull @Size(9L) float[] toXYZ, @Nonnull DoubleUnaryOperator oetf, @Nonnull DoubleUnaryOperator eotf) Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix must convert from the RGB space to the profile connection space CIE XYZ.
The range of the color space is imposed to be \([0..1]\).
- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1toXYZ
- 3x3 column-major transform matrix from RGB to the profile connection space CIE XYZ as an array of 9 floats, cannot be nulloetf
- Opto-electronic transfer function, cannot be nulleotf
- Electro-optical transfer function, cannot be null- Throws:
IllegalArgumentException
- If any of the following conditions is met:- The name is null or has a length of 0.
- The OETF is null or the EOTF is null.
- The minimum valid value is >= the maximum valid value.
- See Also:
-
Rgb
public Rgb(@Nonnull @Size(min=1L) String name, @Nonnull @Size(min=6L,max=9L) float[] primaries, @Nonnull @Size(min=2L,max=3L) float[] whitePoint, @Nonnull DoubleUnaryOperator oetf, @Nonnull DoubleUnaryOperator eotf, float min, float max) Creates a new RGB color space using a specified set of primaries and a specified white point.
The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length of the arrays depends on the chosen space:
Space Primaries length White point length xyY 6 2 XYZ 9 3 When the primaries and/or white point are specified in xyY, the Y component does not need to be specified and is assumed to be 1.0. Only the xy components are required.
The ID, areturned by
ColorSpace.getId()
, of an object created by this constructor is alwaysColorSpace.MIN_ID
.- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1primaries
- RGB primaries as an array of 6 (xy) or 9 (XYZ) floatswhitePoint
- Reference white as an array of 2 (xy) or 3 (XYZ) floatsoetf
- Opto-electronic transfer function, cannot be nulleotf
- Electro-optical transfer function, cannot be nullmin
- The minimum valid value in this color space's RGB rangemax
- The maximum valid value in this color space's RGB range- Throws:
IllegalArgumentException
-If any of the following conditions is met:
- The name is null or has a length of 0.
- The primaries array is null or has a length that is neither 6 or 9.
- The white point array is null or has a length that is neither 2 or 3.
- The OETF is null or the EOTF is null.
- The minimum valid value is >= the maximum valid value.
- See Also:
-
Rgb
public Rgb(@Nonnull @Size(min=1L) String name, @Nonnull @Size(9L) float[] toXYZ, @Nonnull ColorSpace.Rgb.TransferParameters function) Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix must convert from the RGB space to the profile connection space CIE XYZ.
The range of the color space is imposed to be \([0..1]\).
- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1toXYZ
- 3x3 column-major transform matrix from RGB to the profile connection space CIE XYZ as an array of 9 floats, cannot be nullfunction
- Parameters for the transfer functions- Throws:
IllegalArgumentException
- If any of the following conditions is met:- The name is null or has a length of 0.
- Gamma is negative.
- See Also:
-
Rgb
public Rgb(@Nonnull @Size(min=1L) String name, @Nonnull @Size(min=6L,max=9L) float[] primaries, @Nonnull @Size(min=2L,max=3L) float[] whitePoint, @Nonnull ColorSpace.Rgb.TransferParameters function) Creates a new RGB color space using a specified set of primaries and a specified white point.
The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length of the arrays depends on the chosen space:
Space Primaries length White point length xyY 6 2 XYZ 9 3 When the primaries and/or white point are specified in xyY, the Y component does not need to be specified and is assumed to be 1.0. Only the xy components are required.
- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1primaries
- RGB primaries as an array of 6 (xy) or 9 (XYZ) floatswhitePoint
- Reference white as an array of 2 (xy) or 3 (XYZ) floatsfunction
- Parameters for the transfer functions- Throws:
IllegalArgumentException
- If any of the following conditions is met:- The name is null or has a length of 0.
- The primaries array is null or has a length that is neither 6 or 9.
- The white point array is null or has a length that is neither 2 or 3.
- The transfer parameters are invalid.
- See Also:
-
Rgb
Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix must convert from the RGB space to the profile connection space CIE XYZ.
The range of the color space is imposed to be \([0..1]\).
- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1toXYZ
- 3x3 column-major transform matrix from RGB to the profile connection space CIE XYZ as an array of 9 floats, cannot be nullgamma
- Gamma to use as the transfer function- Throws:
IllegalArgumentException
- If any of the following conditions is met:- The name is null or has a length of 0.
- Gamma is negative.
- See Also:
-
Rgb
public Rgb(@Nonnull @Size(min=1L) String name, @Nonnull @Size(min=6L,max=9L) float[] primaries, @Nonnull @Size(min=2L,max=3L) float[] whitePoint, double gamma) Creates a new RGB color space using a specified set of primaries and a specified white point.
The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length of the arrays depends on the chosen space:
Space Primaries length White point length xyY 6 2 XYZ 9 3 When the primaries and/or white point are specified in xyY, the Y component does not need to be specified and is assumed to be 1.0. Only the xy components are required.
- Parameters:
name
- Name of the color space, cannot be null, its length must be >= 1primaries
- RGB primaries as an array of 6 (xy) or 9 (XYZ) floatswhitePoint
- Reference white as an array of 2 (xy) or 3 (XYZ) floatsgamma
- Gamma to use as the transfer function- Throws:
IllegalArgumentException
- If any of the following conditions is met:- The name is null or has a length of 0.
- The primaries array is null or has a length that is neither 6 or 9.
- The white point array is null or has a length that is neither 2 or 3.
- Gamma is negative.
- See Also:
-
-
Method Details
-
getWhitePoint
Copies the non-adapted CIE xyY white point of this color space in specified array. The Y component is assumed to be 1 and is therefore not copied into the destination. The x and y components are written in the array at positions 0 and 1 respectively.- Parameters:
whitePoint
- The destination array, cannot be null, its length must be >= 2- Returns:
- The destination array passed as a parameter
- See Also:
-
getWhitePoint
Returns the non-adapted CIE xyY white point of this color space as a new array of 2 floats. The Y component is assumed to be 1 and is therefore not copied into the destination. The x and y components are written in the array at positions 0 and 1 respectively.- Returns:
- A new non-null array of 2 floats
- See Also:
-
getPrimaries
Copies the primaries of this color space in specified array. The Y component is assumed to be 1 and is therefore not copied into the destination. The x and y components of the first primary are written in the array at positions 0 and 1 respectively.Note: Some ColorSpaces represent gray profiles. The concept of primaries for such a ColorSpace does not make sense, so we use a special set of primaries that are all 1s.
- Parameters:
primaries
- The destination array, cannot be null, its length must be >= 6- Returns:
- The destination array passed as a parameter
- See Also:
-
getPrimaries
Returns the primaries of this color space as a new array of 6 floats. The Y component is assumed to be 1 and is therefore not copied into the destination. The x and y components of the first primary are written in the array at positions 0 and 1 respectively.Note: Some ColorSpaces represent gray profiles. The concept of primaries for such a ColorSpace does not make sense, so we use a special set of primaries that are all 1s.
- Returns:
- A new non-null array of 2 floats
- See Also:
-
getTransform
Copies the transform of this color space in specified array. The transform is used to convert from RGB to XYZ (with the same white point as this color space). To connect color spaces, you must first
adapt
them to the same white point.It is recommended to use
ColorSpace.connect(ColorSpace, ColorSpace)
to convert between color spaces.- Parameters:
transform
- The destination array, cannot be null, its length must be >= 9- Returns:
- The destination array passed as a parameter
- See Also:
-
getTransform
Returns the transform of this color space as a new array. The transform is used to convert from RGB to XYZ (with the same white point as this color space). To connect color spaces, you must first
adapt
them to the same white point.It is recommended to use
ColorSpace.connect(ColorSpace, ColorSpace)
to convert between color spaces.- Returns:
- A new array of 9 floats
- See Also:
-
getInverseTransform
@Nonnull @Size(min=9L) public float[] getInverseTransform(@Nonnull @Size(min=9L) float[] inverseTransform) Copies the inverse transform of this color space in specified array. The inverse transform is used to convert from XYZ to RGB (with the same white point as this color space). To connect color spaces, you must first
adapt
them to the same white point.It is recommended to use
ColorSpace.connect(ColorSpace, ColorSpace)
to convert between color spaces.- Parameters:
inverseTransform
- The destination array, cannot be null, its length must be >= 9- Returns:
- The destination array passed as a parameter
- See Also:
-
getInverseTransform
Returns the inverse transform of this color space as a new array. The inverse transform is used to convert from XYZ to RGB (with the same white point as this color space). To connect color spaces, you must first
adapt
them to the same white point.It is recommended to use
ColorSpace.connect(ColorSpace, ColorSpace)
to convert between color spaces.- Returns:
- A new array of 9 floats
- See Also:
-
getOetf
Returns the opto-electronic transfer function (OETF) of this color space. The inverse function is the electro-optical transfer function (EOTF) returned by
getEotf()
. These functions are defined to satisfy the following equality for \(x \in [0..1]\):$$OETF(EOTF(x)) = EOTF(OETF(x)) = x$$
For RGB colors, this function can be used to convert from linear space to "gamma space" (gamma encoded). The terms gamma space and gamma encoded are frequently used because many OETFs can be closely approximated using a simple power function of the form \(x^{\frac{1}{\gamma}}\) (the approximation of the
sRGB
OETF uses \(\gamma=2.2\) for instance).- Returns:
- A transfer function that converts from linear space to "gamma space"
- See Also:
-
getEotf
Returns the electro-optical transfer function (EOTF) of this color space. The inverse function is the opto-electronic transfer function (OETF) returned by
getOetf()
. These functions are defined to satisfy the following equality for \(x \in [0..1]\):$$OETF(EOTF(x)) = EOTF(OETF(x)) = x$$
For RGB colors, this function can be used to convert from "gamma space" (gamma encoded) to linear space. The terms gamma space and gamma encoded are frequently used because many EOTFs can be closely approximated using a simple power function of the form \(x^\gamma\) (the approximation of the
sRGB
EOTF uses \(\gamma=2.2\) for instance).- Returns:
- A transfer function that converts from "gamma space" to linear space
- See Also:
-
getTransferParameters
Returns the parameters used by the
electro-optical
andopto-electronic
transfer functions. If the transfer functions do not match the ICC parametric curves defined in ICC.1:2004-10 (section 10.15), this method returns null.See
ColorSpace.Rgb.TransferParameters
for a full description of the transfer functions.- Returns:
- An instance of
ColorSpace.Rgb.TransferParameters
or null if this color space's transfer functions do not match the equation defined inColorSpace.Rgb.TransferParameters
-
isSrgb
public boolean isSrgb()Description copied from class:ColorSpace
Indicates whether this color space is the sRGB color space or equivalent to the sRGB color space.
A color space is considered sRGB if it meets all the following conditions:
- Its color model is
ColorSpace.Model.RGB
. -
Its primaries are within 1e-3 of the true
sRGB
primaries. -
Its white point is within 1e-3 of the CIE standard
illuminant
D65
. - Its opto-electronic transfer function is not linear.
- Its electro-optical transfer function is not linear.
- Its transfer functions yield values within 1e-3 of
ColorSpace.Named.SRGB
. - Its range is \([0..1]\).
This method always returns true for
ColorSpace.Named.SRGB
.- Overrides:
isSrgb
in classColorSpace
- Returns:
- True if this color space is the sRGB color space (or a close approximation), false otherwise
- Its color model is
-
isWideGamut
public boolean isWideGamut()Description copied from class:ColorSpace
Returns whether this color space is a wide-gamut color space. An RGB color space is wide-gamut if its gamut entirely contains thesRGB
gamut and if the area of its gamut is 90% of greater than the area of theNTSC
gamut.- Specified by:
isWideGamut
in classColorSpace
- Returns:
- True if this color space is a wide-gamut color space, false otherwise
-
getMinValue
public float getMinValue(int component) Description copied from class:ColorSpace
Returns the minimum valid value for the specified component of this color space's color model.- Specified by:
getMinValue
in classColorSpace
- Parameters:
component
- The index of the component- Returns:
- A floating point value less than
ColorSpace.getMaxValue(int)
- See Also:
-
getMaxValue
public float getMaxValue(int component) Description copied from class:ColorSpace
Returns the maximum valid value for the specified component of this color space's color model.- Specified by:
getMaxValue
in classColorSpace
- Parameters:
component
- The index of the component- Returns:
- A floating point value greater than
ColorSpace.getMinValue(int)
- See Also:
-
toLinear
Decodes an RGB value to linear space. This is achieved by applying this color space's electro-optical transfer function to the supplied values.
Refer to the documentation of
ColorSpace.Rgb
for more information about transfer functions and their use for encoding and decoding RGB values.- Parameters:
r
- The red component to decode to linear spaceg
- The green component to decode to linear spaceb
- The blue component to decode to linear space- Returns:
- A new array of 3 floats containing linear RGB values
- See Also:
-
toLinear
Decodes an RGB value to linear space. This is achieved by applying this color space's electro-optical transfer function to the first 3 values of the supplied array. The result is stored back in the input array.
Refer to the documentation of
ColorSpace.Rgb
for more information about transfer functions and their use for encoding and decoding RGB values.- Parameters:
v
- A non-null array of non-linear RGB values, its length must be at least 3- Returns:
- The specified array
- See Also:
-
fromLinear
Encodes an RGB value from linear space to this color space's "gamma space". This is achieved by applying this color space's opto-electronic transfer function to the supplied values.
Refer to the documentation of
ColorSpace.Rgb
for more information about transfer functions and their use for encoding and decoding RGB values.- Parameters:
r
- The red component to encode from linear spaceg
- The green component to encode from linear spaceb
- The blue component to encode from linear space- Returns:
- A new array of 3 floats containing non-linear RGB values
- See Also:
-
fromLinear
Encodes an RGB value from linear space to this color space's "gamma space". This is achieved by applying this color space's opto-electronic transfer function to the first 3 values of the supplied array. The result is stored back in the input array.
Refer to the documentation of
ColorSpace.Rgb
for more information about transfer functions and their use for encoding and decoding RGB values.- Parameters:
v
- A non-null array of linear RGB values, its length must be at least 3- Returns:
- A new array of 3 floats containing non-linear RGB values
- See Also:
-
toXyz
Description copied from class:ColorSpace
Converts a color value from this color space's model to tristimulus CIE XYZ values. If the color model of this color space is not
RGB
, it is assumed that the target CIE XYZ space uses aD50
standard illuminant.The specified array's length must be at least equal to to the number of color components as returned by
ColorSpace.Model.getComponentCount()
.- Specified by:
toXyz
in classColorSpace
- Parameters:
v
- An array of color components containing the color space's color value to convert to XYZ, and large enough to hold the resulting tristimulus XYZ values- Returns:
- The array passed in parameter
- See Also:
-
fromXyz
Description copied from class:ColorSpace
Converts tristimulus values from the CIE XYZ space to this color space's color model. The resulting value is passed back in the specified array.
The specified array's length must be at least equal to to the number of color components as returned by
ColorSpace.Model.getComponentCount()
, and its first 3 values must be the XYZ components to convert from.- Specified by:
fromXyz
in classColorSpace
- Parameters:
v
- An array of color components containing the XYZ values to convert from, and large enough to hold the number of components of this color space's model- Returns:
- The array passed in parameter
- See Also:
-
hashCode
public int hashCode()- Overrides:
hashCode
in classColorSpace
-
equals
- Overrides:
equals
in classColorSpace
-