YCbCr Color Space
YCbCr separates luminance (brightness) from chrominance (color information). It's widely used in video encoding, digital photography, and image compression formats like JPEG.
Channels
YCbCr has three channels:
y(Luminance): Brightness information, 0.0-100.0cb(Blue-difference chroma): Blue-yellow color information, -128 to 127cr(Red-difference chroma): Red-green color information, -128 to 127
Channel Ranges
- Luminance (
y): 0.0-100.0 (float)0.0= Black100.0= White
- Cb (Blue-difference): -128 to 127 (integer)
- Negative = More blue
- Positive = More yellow
0= Neutral
- Cr (Red-difference): -128 to 127 (integer)
- Negative = More green
- Positive = More red
0= Neutral
Default Values
All channels default to 0 when not specified, resulting in black (ycbcr(0, 0, 0)).
Creating YCbCr Colors
use Negarity\Color\Color;
// Create a YCbCr color
$color = Color::ycbcr(78.5, 100, -100);
// Note: Y is a float, Cb and Cr are integers
$color = Color::ycbcr(50.0, 0, 0); // Gray
Working with YCbCr Channels
Getting Channel Values
$color = Color::ycbcr(78.5, 50, -75);
$y = $color->getY(); // 78.5 (float)
$cb = $color->getCb(); // 50 (int)
$cr = $color->getCr(); // -75 (int)
Checking Channel Existence
use Negarity\Color\ColorSpace\YCbCr;
YCbCr::hasChannel('y'); // true
YCbCr::hasChannel('cb'); // true
YCbCr::hasChannel('cr'); // true
YCbCr::hasChannel('l'); // false (that's Lab/LCh)
Getting Channel Defaults
use Negarity\Color\ColorSpace\YCbCr;
YCbCr::getChannelDefaultValue('y'); // 0
YCbCr::getChannelDefaultValue('cb'); // 0
YCbCr::getChannelDefaultValue('cr'); // 0
Getting All Channels
use Negarity\Color\ColorSpace\YCbCr;
YCbCr::getChannels(); // ['y', 'cb', 'cr']
Validation
YCbCr validates channel values with different ranges for each channel:
use Negarity\Color\Color;
use Negarity\Color\Exception\InvalidColorValueException;
try {
// This will throw InvalidColorValueException
$color = Color::ycbcr(150.0, 50, -75); // Y exceeds 100.0
} catch (InvalidColorValueException $e) {
// Handle error
}
try {
// This will also throw InvalidColorValueException
$color = Color::ycbcr(50.0, 200, -75); // Cb exceeds 127
} catch (InvalidColorValueException $e) {
// Handle error
}
Understanding YCbCr
Luminance-Chrominance Separation
YCbCr separates an image into:
- Y (Luminance): The brightness/grayscale information
- Cb and Cr (Chrominance): The color information
This separation is useful because:
- Human vision is more sensitive to brightness than color
- Chrominance can be compressed more aggressively
- Allows for efficient image and video compression
The Cb and Cr Channels
- Cb (Blue-difference): Represents the blue-yellow axis
- Negative values = More blue
- Positive values = More yellow
- Cr (Red-difference): Represents the red-green axis
- Negative values = More green
- Positive values = More red
Mixed Data Types
YCbCr is unique in that it uses:
- Float for Y: Allows for precise luminance values
- Integer for Cb/Cr: Sufficient precision for chrominance
Use Cases
- Video Encoding: MPEG, H.264, H.265 video formats
- Image Compression: JPEG uses a variant of YCbCr
- Digital Photography: Many cameras use YCbCr internally
- Broadcast Television: Standard for TV signal transmission
- Image Processing: Efficient color manipulation and compression
Color Space Information
use Negarity\Color\ColorSpace\YCbCr;
YCbCr::getName(); // "ycbcr"
YCbCr::getChannels(); // ['y', 'cb', 'cr']
YCbCr::supportsIlluminant(); // false
YCbCr::supportsObserver(); // false
See Also
- Creating Colors - How to create YCbCr colors
- Getting Channels - How to access YCbCr channel values