79 lines
2.1 KiB
Markdown
79 lines
2.1 KiB
Markdown
# blurhash-update
|
|
|
|
_A blurhash encoder for streaming bytes_
|
|
|
|
## Supports
|
|
- [x] Encoding
|
|
- [ ] Decoding
|
|
|
|
## Motivation
|
|
|
|
There exists already a [blurhash crate](https://github.com/whisperfish/blurhash-rs), which is a good
|
|
choice for creating blurhashes, however, it requires that all pixels for a given image exist in
|
|
memory in order to compute it. For very large images, this might not be ideal.
|
|
|
|
blurhash-update provides an API for processing bytes from an image as they are made available. This
|
|
isn't as performant as blurhash in like-for-like comparisons, but the benefit of a lower memory
|
|
overhead can be useful in some scenarios.
|
|
|
|
blurhash-update also provides the ability to reduce accuracy by skipping processing of some of the
|
|
input pixels. This greatly improves performance, but might lead to blurhashes that don't look quite
|
|
right. Using blurhash-update's `auto` encoder configuration will target an extremely performant but
|
|
very loose profile based on the image dimensions.
|
|
|
|
## Usage
|
|
|
|
```rust,no_run
|
|
use std::io::Read;
|
|
|
|
use blurhash_update::{Components, Encoder, ImageBounds};
|
|
use clap::Parser;
|
|
|
|
#[derive(clap::Parser)]
|
|
struct Args {
|
|
/// Width of the provided image
|
|
#[clap(long)]
|
|
width: u32,
|
|
|
|
/// Height of the provided image
|
|
#[clap(long)]
|
|
height: u32,
|
|
}
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let Args { width, height } = Args::parse();
|
|
let mut encoder = Encoder::new(Components { x: 4, y: 3 }, ImageBounds { width, height }, 1)?;
|
|
|
|
let mut stdin = std::io::stdin().lock();
|
|
let mut buf = [0u8; 1024];
|
|
|
|
loop {
|
|
let n = stdin.read(&mut buf)?;
|
|
|
|
if n == 0 {
|
|
break;
|
|
}
|
|
|
|
encoder.update(&buf[..n]);
|
|
}
|
|
|
|
println!("{}", encoder.finalize());
|
|
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
Example usage:
|
|
```bash
|
|
magick convert /path/to/image RGBA:- | \
|
|
cargo r --example --release -- --width blah --height blah
|
|
```
|
|
|
|
## License
|
|
|
|
blurhash-update is licensed under either of the following:
|
|
|
|
- Apache License, Version 2.0, ([LICENSE-APACHE](./LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)
|
|
- MIT license ([LICENSE-MIT](./LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
|
|
|