An unofficial port of the material-color-utilities
library for creating Material You themes and color schemes.
std
: enabled by default, disabling makes it possible to use the crate inno_std
environments, provided there is an allocator availableimage
: adds support for extracting colors from images, requiresstd
feature enabledserde
: adds support for JSON serialization of themes and color schemeslibm
: adds the built-in implementation ofFloatExt
trait, which is based onlibm
From HEX color:
use material_colors::{color::Argb, theme::ThemeBuilder};
let theme = ThemeBuilder::with_source(Argb::from_u32(0xffaae5a4)).build();
// Do whatever you want...
From image:
⚠️ Before obtaining an array of ARGB pixels for the image, it is recommended (but not necessary if your image is already small in size or you just don't mind about execution time) to adjust its dimensions to 128x128 byfunc:resize
fromstruct:Image
provided bystruct:ImageReader
. The reason is described here.
use material_colors::{
image::{FilterType, ImageReader},
theme::ThemeBuilder,
};
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let image = reqwest::get("https://picsum.photos/id/866/1920/1080")
.await?
.bytes()
.await?
.to_vec();
let mut data = ImageReader::read(image).expect("failed to read image");
// Lancsoz3 takes a little longer, but provides the best pixels for color extraction.
// However, if you don't like the results, you can always try other FilterType values.
data.resize(128, 128, FilterType::Lanczos3);
let theme = ThemeBuilder::with_source(ImageReader::extract_color(&data)).build();
// Do whatever you want...
Ok(())
}
This library requires alloc
because Quantizer
and Score
make heavy use of Vec
, and DynamicColor
requires Box
for function storage.
It also makes heavy use of various floating point functions, which greatly reduces the number of supported platforms. Yes, we have libm
as a fallback, but it gives extremely different and inaccurate results, with unexpected consequences, and is also obviously much slower.
In case you have a platform where there are corresponding instructions for operations on floating point numbers, you will have to fork the repository yourself, as I unfortunately don't have any way to create an implementation for every platform that has corresponding instructions. If you have any suggestions, however, I'd be happy to hear them.
The Minimum Supported Rust Version is currently 1.63.0.
Dual-licensed to be compatible with the Rust project.
Licensed under the Apache License, Version 2.0 or the MIT license, at your option. This project may not be copied, modified, or distributed except according to those terms.