Crates.io | exoquant |
lib.rs | exoquant |
version | 0.2.0 |
source | src |
created_at | 2016-09-04 15:26:55.312489 |
updated_at | 2016-09-04 19:25:04.170985 |
description | Very high quality image quantization |
homepage | |
repository | https://github.com/exoticorn/exoquant-rs |
max_upload_size | |
id | 6235 |
size | 54,406 |
Exoquant is a very high quality image quantization library written in Rust featuring code for basic color quantization, K-Means palette optimization and remapping and dithering with Floyd-Steinberg and ordered ditherers.
This version of the library is a much improved rewrite of a C library of the same name written back in 2004.
Add exoquant as a dependency to your Cargo.toml:
[dependencies]
exoquant = "0.2.0"
For simple use cases, there is a convenience function that simply takes true color image data + a few options as input and returns the palette and indexed image data as output:
use exoquant::*;
let image = testdata::test_image();
let (palette, indexed_data) = convert_to_indexed(&image.pixels, image.width, 256,
&optimizer::KMeans, &ditherer::FloydSteinberg::new());
The low-level API gives you full control over the quantization workflow. It allows for use-cases like:
Using the low-level API to quantize an image looks like this:
use exoquant::*;
use exoquant::optimizer::Optimizer;
let image = testdata::test_image();
let histogram = image.pixels.iter().cloned().collect();
let colorspace = SimpleColorSpace::default();
let optimizer = optimizer::KMeans;
let mut quantizer = Quantizer::new(&histogram, &colorspace);
while quantizer.num_colors() < 256 {
quantizer.step();
// very optional optimization, !very slow!
// you probably only want to do this every N steps, if at all.
if quantizer.num_colors() % 64 == 0 {
quantizer = quantizer.optimize(&optimizer, 4);
}
}
let palette = quantizer.colors(&colorspace);
// this optimization is more useful than the above and a lot less slow
let palette = optimizer.optimize_palette(&colorspace, &palette, &histogram, 16);
let ditherer = ditherer::FloydSteinberg::new();
let remapper = Remapper::new(&palette, &colorspace, &ditherer);
let indexed_data = remapper.remap(&image.pixels, image.width);