# 🎨 Pigmnts
Pigmnts is a library to create a color palette from an image built using Rust, compiled to WebAssembly. This allows for super-fast color palette extraction from an image on the web. It uses the [K-means++](https://en.wikipedia.org/wiki/K-means%2B%2B) clustering algorithm to select the most commonly occuring colors from the image.
## Examples with Web Assembly
### As a JavaScript module
```html
```
### In Node.js
1. Start by installing the npm package
```bash
npm install pigmnts
```
2. Configure your build process to copy the wasm file in the your build directory.
3. Use it in code
```javascript
import init, { pigments } from 'pigmnts';
async function run() {
// Load the wasm file from path where wasm file was copied by the bundler
await init('');
// Canvas element from which palette should be created
const canvas = document.querySelector('canvas');
// Call the pigments wasm function
const palette = pigments(canvas, 5);
}
run();
```
## Functions
Pigmnts exposes following function in WebAssembly
#### pigments(canvas: `HtmlCanvasElement`, k: `number`, mood: `Mood|number`, batch_size: `number`)
##### Arguments
- `canvas` canvas element which has the image to be processed. Internally, the pixel data is taken from the canvas, and then clustered to create the color palette.
- `k` defines the number of colors to be gathered from the image.
- `mood` defines the weight function to use. Only 'dominant' mood is supported which has a value of `0`
- `batch_size` (optional) defines the number of pixels to randomly sample from the image. It should be greater than the total number of pixels in the image and the `k`. By default, all the pixels in the image are processed.
##### Return
Returns an Array of Objects where each Object is a color of the following format.
```javascript
[
{
dominance: 0.565 // Dominance of color in image(From 0 to 1)
hex: '#6DDAD0' // 6-digit Hex color code
rgb: { // Equivalent RGB color
r: 109,
g: 218,
b: 208
},
hsl: { // Equivalent HSL color (Normalized to 0-1)
h: 0.48333,
s: 0.6,
l: 0.64,
}
},
// Other colors
{
...
}
]
```
If this crate is used in some Rust projects, then following function is also available
#### pigments_pixels(pixels: `&Vec`, k: `u8`, weight: `fn(&LAB) -> f32`, max_iter: `Option`) -> `Vec<(LAB, f32)>`
This function can be used when color data is gathered from an image decoded using [image-rs](https://github.com/image-rs/image).
##### Arguments
- `pixels` reference to a Vector of colors in `LAB` format.
- `k` defines the number of colors to be gathered from the image.
- `weight` defines the weight function to use. `src/weights.rs` file has few implemented weight functions.
- `max_iter` defines the maximum iterations that algorithm makes, default is `300`
##### Return
Returns a vector of tuples with colors as `LAB` and dominance(as percentage) of each color found in the image.
## License
Pigmnts is [MIT Licensed](https://github.com/blenderskool/pigmnts/blob/master/LICENSE.md)