# Lab

Tools for converting RGB colors to L*a*b* measurements.

RGB colors, for this crate at least, are considered to be composed of `u8` values from 0 to 255, while L*a*b* colors are represented by its own struct that uses `f32` values.

# Usage

## Converting single values

To convert a single value, use one of the functions

• `lab::Lab::from_rgb(rgb: &[u8; 3]) -> Lab`
• `lab::Lab::from_rgba(rgba: &[u8; 4]) -> Lab` (drops the fourth alpha byte)
• `lab::Lab::to_rgb(&self) -> [u8; 3]`
```extern crate lab;
use lab::Lab;

let pink_in_lab = Lab::from_rgb(&[253, 120, 138]);
// Lab { l: 66.639084, a: 52.251457, b: 14.860654 }```

## Converting multiple values

To convert slices of values

• `lab::rgbs_to_labs(rgbs: &[[u8; 3]]) -> Vec<Lab>`
• `lab::labs_to_rgbs(labs: &[Lab]) -> Vec<[u8; 3]>`
• `lab::rgb_bytes_to_labs(bytes: &[u8]) -> Vec<Lab>`
• `lab::labs_to_rgb_bytes(labs: &[Lab]) -> Vec<u8>`
```extern crate lab;
use lab::rgbs_to_labs;

let rgbs = vec![
[0xFF, 0x69, 0xB6],
[0xE7, 0x00, 0x00],
[0xFF, 0x8C, 0x00],
[0xFF, 0xEF, 0x00],
[0x00, 0x81, 0x1F],
[0x00, 0xC1, 0xC1],
[0x00, 0x44, 0xFF],
[0x76, 0x00, 0x89],
];

let labs = rgbs_to_labs(&rgbs);```
```extern crate lab;
use lab::rgb_bytes_to_labs;

let rgbs = vec![
0xFF, 0x69, 0xB6,
0xE7, 0x00, 0x00,
0xFF, 0x8C, 0x00,
0xFF, 0xEF, 0x00,
0x00, 0x81, 0x1F,
0x00, 0xC1, 0xC1,
0x00, 0x44, 0xFF,
0x76, 0x00, 0x89,
];

let labs = rgb_bytes_to_labs(&rgbs);```

These functions will use x86_64 AVX2 instructions if compiled to a supported target.

## Minimum Rust version

Lab 0.7.0 requires Rust >= 1.31.0 for the chunks_exact slice method

## Structs

 Lab Struct representing a color in L*a*b* space

## Functions

 labs_to_rgb_bytes Lab to RGB conversion that returns RGB triples flattened into a `Vec` labs_to_rgbs Convenience function to map a slice of Lab values to RGB values in serial rgb_bytes_to_labs RGB to Lab conversion that operates on a flat `&[u8]` of consecutive RGB triples. rgbs_to_labs Convenience function to map a slice of RGB values to Lab values in serial