Class Color
The Color
class provides methods for creating, converting and
manipulating colors.
Color int
Color int is the most common representation.
A color int always defines a color in the sRGB color space using 4 components packed in a single 32 bit integer value:
Component | Name | Size | Range |
---|---|---|---|
A | Alpha | 8 bits | \([0..255]\) |
R | Red | 8 bits | \([0..255]\) |
G | Green | 8 bits | \([0..255]\) |
B | Blue | 8 bits | \([0..255]\) |
The components in this table are listed in encoding order (see below),
which is why color ints are called ARGB colors. Note that this packing format
is exactly mapped to Bitmap.Format.BGRA_8888_PACK32
.
Usage in code
To avoid confusing color ints with arbitrary integer values, it is a
good practice to annotate them with the @ColorInt
annotation.
Encoding
The four components of a color int are encoded in the following way:
int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
Because of this encoding, color ints can easily be described as an integer
constant in source. For instance, opaque blue is 0xff0000ff
and yellow is 0xffffff00
.
To easily encode color ints, it is recommended to use the static methods
argb(int, int, int, int)
and rgb(int, int, int)
. The second
method omits the alpha component and assumes the color is opaque (alpha is 255).
As a convenience this class also offers methods to encode color ints from components
defined in the \([0..1]\) range: argb(float, float, float, float)
and
rgb(float, float, float)
.
Decoding
The four ARGB components can be individually extracted from a color int using the following expressions:
int A = (color >> 24) & 0xff; // or color >>> 24 int R = (color >> 16) & 0xff; int G = (color >> 8) & 0xff; int B = (color ) & 0xff;
This class offers convenience methods to easily extract these components:
alpha(int)
to extract the alpha componentred(int)
to extract the red componentgreen(int)
to extract the green componentblue(int)
to extract the blue component
Color4f
Color4f is a representation of RGBA color values in the sRGB color space, holding four floating-point components, to store colors with more precision than color ints. Color components are always in a known order. RGB components may be premultiplied by alpha or not, but public API always uses un-premultiplied colors.
Alpha and transparency
The alpha component of a color defines the level of transparency of a color. When the alpha component is 0, the color is completely transparent. When the alpha is component is 1 (in the \([0..1]\) range) or 255 (in the \([0..255]\) range), the color is completely opaque.
The color representations described above do not use pre-multiplied
color components (a pre-multiplied color component is a color component
that has been multiplied by the value of the alpha component).
For instance, the color int representation of opaque red is
0xffff0000
. For semi-transparent (50%) red, the
representation becomes 0x80ff0000
. The equivalent color
instance representations would be (1.0, 0.0, 0.0, 1.0)
and (1.0, 0.0, 0.0, 0.5)
.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
Represents fully opaque black.static final int
Represents fully opaque blue.static final int
Represents fully opaque cyan.static final int
Represents fully opaque dark gray.static final int
Represents fully opaque gray.static final int
Represents fully opaque green.static final int
Represents fully opaque light gray.static final int
Represents fully opaque magenta.static final int
Represents fully opaque red.static final int
Represents fully transparent Color.static final int
Represents fully opaque white.static final int
Represents fully opaque yellow. -
Method Summary
Modifier and TypeMethodDescriptionfloat
alpha()
Returns the value of the alpha component in the range \([0..1]\).static int
alpha
(int color) Return the alpha component of a color int.static int
argb
(float alpha, float red, float green, float blue) Return a color-int from alpha, red, green, blue float components in the range \([0..1]\).static int
argb
(int alpha, int red, int green, int blue) Return a color-int from alpha, red, green, blue components.static int
Blends the two colors using premultiplied alpha on CPU side.float
blue()
Returns the value of the blue component in the range defined by this color's color space (seeColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).static int
blue
(int color) Return the blue component of a color int.convert
(ColorSpace colorSpace) Converts this color from its color space to the specified color space.boolean
static float
GammaToLinear
(float x) Converts a color component from the sRGB space to the linear RGB space, using the sRGB transfer function.static void
GammaToLinear
(float[] col) Converts a color from the sRGB space to the linear RGB space, using the sRGB transfer function.Returns this color's color space.float
getComponent
(int component) Returns the value of the specified component in the range defined by this color's color space (seeColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).int
Returns the number of components that form a color value according to this color space's color model, plus one extra component for alpha.float[]
Returns this color's components as a new array.float[]
getComponents
(float[] components) Copies this color's components in the supplied array.getModel()
Returns the color model of this color.float
green()
Returns the value of the green component in the range defined by this color's color space (seeColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).static int
green
(int color) Return the green component of a color int.int
hashCode()
static int
HSVToColor
(float[] hsv) Converts HSV components to an RGB color.static int
HSVToColor
(float h, float s, float v) Converts HSV components to an RGB color.boolean
isSrgb()
Indicates whether this color is in thesRGB
color space.boolean
Indicates whether this color color is in a wide-gamut color space.static float
lightness
(float lum) Coverts a luminance value to a perceptual lightness value.static float
LinearToGamma
(float x) Converts a color component from the linear RGB space to the sRGB space, using the inverse of sRGB transfer function.static void
LinearToGamma
(float[] col) Converts a color from the linear RGB space to the sRGB space, using the inverse of sRGB transfer function.float
Returns the relative luminance of this color.static float
luminance
(float[] col) Converts a linear RGB color to a luminance value.static float
luminance
(float r, float g, float b) Converts a linear RGB color to a luminance value.static float
luminance
(int color) Returns the relative luminance of a color.static int
parseColor
(String colorString) Parse the color string, and return the corresponding color-int.float
red()
Returns the value of the red component in the range defined by this color's color space (seeColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).static int
red
(int color) Return the red component of a color int.static int
rgb
(float red, float green, float blue) Return a color-int from red, green, blue float components in the range \([0..1]\).static int
rgb
(int red, int green, int blue) Return a color-int from red, green, blue components.static void
RGBToHSV
(int color, float[] hsv) Converts RGB to its HSV components.static void
RGBToHSV
(int r, int g, int b, float[] hsv) Converts RGB to its HSV components.int
toArgb()
Converts this color to an ARGB color int.toString()
Returns a string representation of the object.static Color
valueOf
(float[] components, ColorSpace colorSpace) Creates a newColor
in the specified color space with the specified component values.static Color
valueOf
(float r, float g, float b) Creates a new opaqueColor
in thesRGB
color space with the specified red, green and blue component values.static Color
valueOf
(float r, float g, float b, float a) Creates a newColor
in thesRGB
color space with the specified red, green, blue and alpha component values.static Color
valueOf
(float r, float g, float b, float a, ColorSpace colorSpace) Creates a newColor
in the specified color space with the specified red, green, blue and alpha component values.static Color
valueOf
(int color) Creates a newColor
instance from an ARGB color int.
-
Field Details
-
TRANSPARENT
Represents fully transparent Color. May be used to initialize a destination containing a mask or a non-rectangular image.- See Also:
-
BLACK
Represents fully opaque black.- See Also:
-
DKGRAY
Represents fully opaque dark gray. Note that SVG dark gray is equivalent to 0xFFA9A9A9.- See Also:
-
GRAY
Represents fully opaque gray. Note that HTML gray is equivalent to 0xFF808080.- See Also:
-
LTGRAY
Represents fully opaque light gray. HTML silver is equivalent to 0xFFC0C0C0. Note that SVG light gray is equivalent to 0xFFD3D3D3.- See Also:
-
WHITE
Represents fully opaque white.- See Also:
-
RED
Represents fully opaque red.- See Also:
-
GREEN
Represents fully opaque green. HTML lime is equivalent. Note that HTML green is equivalent to 0xFF008000.- See Also:
-
BLUE
Represents fully opaque blue.- See Also:
-
YELLOW
Represents fully opaque yellow.- See Also:
-
CYAN
Represents fully opaque cyan. HTML aqua is equivalent.- See Also:
-
MAGENTA
Represents fully opaque magenta. HTML fuchsia is equivalent.- See Also:
-
-
Method Details
-
getColorSpace
Returns this color's color space.- Returns:
- A non-null instance of
ColorSpace
-
getModel
Returns the color model of this color.- Returns:
- A non-null
ColorSpace.Model
-
isWideGamut
public boolean isWideGamut()Indicates whether this color color is in a wide-gamut color space. SeeColorSpace.isWideGamut()
for a definition of a wide-gamut color space.- Returns:
- True if this color is in a wide-gamut color space, false otherwise
- See Also:
-
isSrgb
public boolean isSrgb()Indicates whether this color is in thesRGB
color space.- Returns:
- True if this color is in the sRGB color space, false otherwise
- See Also:
-
getComponentCount
Returns the number of components that form a color value according to this color space's color model, plus one extra component for alpha.- Returns:
- The integer 4 or 5
-
convert
Converts this color from its color space to the specified color space. The conversion is done using the default rendering intent as specified byColorSpace.connect(ColorSpace, ColorSpace)
.- Parameters:
colorSpace
- The destination color space, cannot be null- Returns:
- A non-null color instance in the specified color space
-
toArgb
Converts this color to an ARGB color int. A color int is always in thesRGB
color space. This implies a color space conversion is applied if needed.- Returns:
- An ARGB color in the sRGB color space
-
red
public float red()Returns the value of the red component in the range defined by this color's color space (see
ColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).If this color's color model is not
RGB
, calling this method is equivalent togetComponent(0)
.- See Also:
-
green
public float green()Returns the value of the green component in the range defined by this color's color space (see
ColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).If this color's color model is not
RGB
, calling this method is equivalent togetComponent(1)
.- See Also:
-
blue
public float blue()Returns the value of the blue component in the range defined by this color's color space (see
ColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).If this color's color model is not
RGB
, calling this method is equivalent togetComponent(2)
.- See Also:
-
alpha
public float alpha()Returns the value of the alpha component in the range \([0..1]\). Calling this method is equivalent togetComponent(getComponentCount() - 1)
.- See Also:
-
getComponents
Returns this color's components as a new array. The last element of the array is always the alpha component.- Returns:
- A new, non-null array whose size is equal to
getComponentCount()
- See Also:
-
getComponents
Copies this color's components in the supplied array. The last element of the array is always the alpha component.- Parameters:
components
- An array of floats whose size must be at leastgetComponentCount()
, can be null- Returns:
- The array passed as a parameter if not null, or a new array of length
getComponentCount()
- Throws:
IllegalArgumentException
- If the specified array's length is less thangetComponentCount()
- See Also:
-
getComponent
Returns the value of the specified component in the range defined by this color's color space (see
ColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
).If the requested component index is
getComponentCount()
, this method returns the alpha component, always in the range \([0..1]\).- Throws:
ArrayIndexOutOfBoundsException
- If the specified component index is invalid input: '<' 0 or >=getComponentCount()
- See Also:
-
luminance
public float luminance()Returns the relative luminance of this color.
Based on the formula for relative luminance defined in WCAG 2.0, W3C Recommendation 11 December 2008.
- Returns:
- A value between 0 (darkest black) and 1 (lightest white)
- Throws:
IllegalArgumentException
- If this color's color space does not use theRGB
color model
-
equals
-
hashCode
public int hashCode() -
toString
Returns a string representation of the object. This method returns a string equal to the value of:
"Color(" + r + ", " + g + ", " + b + ", " + a + ", " + getColorSpace().getName + ')'
For instance, the string representation of opaque black in the sRGB color space is equal to the following value:
Color(0.0, 0.0, 0.0, 1.0, sRGB IEC61966-2.1)
-
valueOf
Creates a newColor
instance from an ARGB color int. The resulting color is in thesRGB
color space.- Parameters:
color
- The ARGB color int to create aColor
from- Returns:
- A non-null instance of
Color
-
valueOf
Creates a new opaqueColor
in thesRGB
color space with the specified red, green and blue component values. The component values must be in the range \([0..1]\).- Parameters:
r
- The red component of the opaque sRGB color to create, in \([0..1]\)g
- The green component of the opaque sRGB color to create, in \([0..1]\)b
- The blue component of the opaque sRGB color to create, in \([0..1]\)- Returns:
- A non-null instance of
Color
-
valueOf
Creates a newColor
in thesRGB
color space with the specified red, green, blue and alpha component values. The component values must be in the range \([0..1]\).- Parameters:
r
- The red component of the sRGB color to create, in \([0..1]\)g
- The green component of the sRGB color to create, in \([0..1]\)b
- The blue component of the sRGB color to create, in \([0..1]\)a
- The alpha component of the sRGB color to create, in \([0..1]\)- Returns:
- A non-null instance of
Color
-
valueOf
@NonNull public static Color valueOf(float r, float g, float b, float a, @NonNull ColorSpace colorSpace) Creates a newColor
in the specified color space with the specified red, green, blue and alpha component values. The range of the components is defined byColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
. The values passed to this method must be in the proper range.- Parameters:
r
- The red component of the color to createg
- The green component of the color to createb
- The blue component of the color to createa
- The alpha component of the color to create, in \([0..1]\)colorSpace
- The color space of the color to create- Returns:
- A non-null instance of
Color
- Throws:
IllegalArgumentException
- If the specified color space uses a color model with more than 3 components
-
valueOf
@NonNull public static Color valueOf(@NonNull @Size(min=4L,max=5L) float[] components, @NonNull ColorSpace colorSpace) Creates a new
Color
in the specified color space with the specified component values. The range of the components is defined byColorSpace.getMinValue(int)
andColorSpace.getMaxValue(int)
. The values passed to this method must be in the proper range. The alpha component is always in the range \([0..1]\).The length of the array of components must be at least
. The component at indexColorSpace.getComponentCount()
+ 1ColorSpace.getComponentCount()
is always alpha.- Parameters:
components
- The components of the color to create, with alpha as the last componentcolorSpace
- The color space of the color to create- Returns:
- A non-null instance of
Color
- Throws:
IllegalArgumentException
- If the array of components is smaller than required by the color space
-
alpha
Return the alpha component of a color int. This is the same as saying color >>> 24 -
red
Return the red component of a color int. This is the same as saying (color >> 16) invalid input: '&' 0xFF -
green
Return the green component of a color int. This is the same as saying (color >> 8) invalid input: '&' 0xFF -
blue
Return the blue component of a color int. This is the same as saying color invalid input: '&' 0xFF -
rgb
@ColorInt public static int rgb(@IntRange(from=0L,to=255L) int red, @IntRange(from=0L,to=255L) int green, @IntRange(from=0L,to=255L) int blue) Return a color-int from red, green, blue components. The alpha component is implicitly 255 (fully opaque). These component values should be \([0..255]\), but there is no range check performed, so if they are out of range, the returned color is undefined.- Parameters:
red
- Red component \([0..255]\) of the colorgreen
- Green component \([0..255]\) of the colorblue
- Blue component \([0..255]\) of the color
-
rgb
Return a color-int from red, green, blue float components in the range \([0..1]\). The alpha component is implicitly 1.0 (fully opaque). If the components are out of range, the returned color is undefined.- Parameters:
red
- Red component \([0..1]\) of the colorgreen
- Green component \([0..1]\) of the colorblue
- Blue component \([0..1]\) of the color
-
argb
@ColorInt public static int argb(@IntRange(from=0L,to=255L) int alpha, @IntRange(from=0L,to=255L) int red, @IntRange(from=0L,to=255L) int green, @IntRange(from=0L,to=255L) int blue) Return a color-int from alpha, red, green, blue components. These component values should be \([0..255]\), but there is no range check performed, so if they are out of range, the returned color is undefined.- Parameters:
alpha
- Alpha component \([0..255]\) of the colorred
- Red component \([0..255]\) of the colorgreen
- Green component \([0..255]\) of the colorblue
- Blue component \([0..255]\) of the color
-
argb
Return a color-int from alpha, red, green, blue float components in the range \([0..1]\). If the components are out of range, the returned color is undefined.- Parameters:
alpha
- Alpha component \([0..1]\) of the colorred
- Red component \([0..1]\) of the colorgreen
- Green component \([0..1]\) of the colorblue
- Blue component \([0..1]\) of the color
-
parseColor
Parse the color string, and return the corresponding color-int. If the string cannot be parsed, throws anIllegalArgumentException
exception. Supported formats are:#RRGGBB
#AARRGGBB
0xRRGGBB
0xAARRGGBB
The following names are also accepted:
red
,blue
,green
,black
,white
,gray
,cyan
,magenta
,yellow
,lightgray
,darkgray
,grey
,lightgrey
,darkgrey
,aqua
,fuchsia
,lime
,maroon
,navy
,olive
,purple
,silver
, andteal
. -
RGBToHSV
public static void RGBToHSV(@IntRange(from=0L,to=255L) int r, @IntRange(from=0L,to=255L) int g, @IntRange(from=0L,to=255L) int b, @NonNull @Size(3L) float[] hsv) Converts RGB to its HSV components. hsv[0] contains hsv hue, a value from zero to less than 360. hsv[1] contains hsv saturation, a value from zero to one. hsv[2] contains hsv value, a value from zero to one.- Parameters:
r
- red component value from zero to 255g
- green component value from zero to 255b
- blue component value from zero to 255hsv
- three element array which holds the resulting HSV components
-
RGBToHSV
Converts RGB to its HSV components. Alpha in ARGB (if it has) is ignored. hsv[0] contains hsv hue, and is assigned a value from zero to less than 360. hsv[1] contains hsv saturation, a value from zero to one. hsv[2] contains hsv value, a value from zero to one.- Parameters:
color
- RGB or ARGB color to converthsv
- three element array which holds the resulting HSV components
-
HSVToColor
Converts HSV components to an RGB color. Alpha is NOT implicitly set.Out of range hsv values are clamped.
- Parameters:
h
- hsv hue, an angle from zero to less than 360s
- hsv saturation, and varies from zero to onev
- hsv value, and varies from zero to one- Returns:
- RGB equivalent to HSV, without alpha
-
HSVToColor
Converts HSV components to an RGB color. Alpha is NOT implicitly set. hsv[0] represents hsv hue, an angle from zero to less than 360. hsv[1] represents hsv saturation, and varies from zero to one. hsv[2] represents hsv value, and varies from zero to one.Out of range hsv values are clamped.
- Parameters:
hsv
- three element array which holds the input HSV components- Returns:
- RGB equivalent to HSV, without alpha
-
GammaToLinear
public static float GammaToLinear(float x) Converts a color component from the sRGB space to the linear RGB space, using the sRGB transfer function.- Parameters:
x
- a color component- Returns:
- transformed color component
-
LinearToGamma
public static float LinearToGamma(float x) Converts a color component from the linear RGB space to the sRGB space, using the inverse of sRGB transfer function.- Parameters:
x
- a color component- Returns:
- transformed color component
-
GammaToLinear
Converts a color from the sRGB space to the linear RGB space, using the sRGB transfer function.- Parameters:
col
- the color components
-
LinearToGamma
Converts a color from the linear RGB space to the sRGB space, using the inverse of sRGB transfer function.- Parameters:
col
- the color components
-
luminance
Returns the relative luminance of a color.Assumes sRGB encoding. Based on the formula for relative luminance defined in WCAG 2.0, W3C Recommendation 11 December 2008.
- Returns:
- a value between 0 (darkest black) and 1 (lightest white)
-
luminance
public static float luminance(float r, float g, float b) Converts a linear RGB color to a luminance value. -
luminance
Converts a linear RGB color to a luminance value.- Parameters:
col
- the color components
-
lightness
public static float lightness(float lum) Coverts a luminance value to a perceptual lightness value. -
blend
@Internal @ColorInt public static int blend(@NonNull BlendMode mode, @ColorInt int src, @ColorInt int dst) Blends the two colors using premultiplied alpha on CPU side. This is to simulate the color blending on GPU side, but this is only used for color filtering (tinting). Do NOT premultiply the src and dst colors with alpha on CPU side. The returned color is un-premultiplied by alpha. This method will not lose precision, color components are still 8-bit.- Parameters:
mode
- the blend mode that determines blending factorssrc
- the source color (straight) to be blended into the destination colordst
- the destination color (straight) on which the source color is to be blended- Returns:
- the color (straight) resulting from the color blending
-