refimage
A Serializable Image Container
This crate provides a type-erased image container (GenericImageRef
), backed by a contiguous slice (owned or referenced) of primitive (u8
, u16
, f32
) pixels, with arbitrary color space (grayscale, Bayer pattern, RGB, ...) and color channels support (max. 255).
Image sizes are limited to 65536 × 65536 for practical reasons.
GenericImageRef
and GenericImageOwned
are powerful, since these metadata in the form of (key
, value
) pairs, with optional comments. Valid metadata keys are case-insensitive, 80-character strings, and values are up to 64-bit integer types, 32- and 64-bit floating point numbers, strings up-to 4096 characters, or std::time::{SystemTime, Duration}
.
GenericImageRef
supports serialization, and, optionally can be saved in the open Flexible Image Transport System (FITS) through the FitsWrite
trait, exposed through the fitsio
optional feature.
FITS files support lossless compression, and saving of arbitrary metadata.
GenericImageRef
serializes to an internal representation which allows deserialization to GenericImageOwned
.
GenericImageOwned
contains owned data, and is freely serialized-deserialized.
The path to a GenericImageRef
A GenericImageRef
is obtained from a ImageRef
object, created with the
appropriate, contiguous, backing storage and image format:
use ;
use SystemTime;
let mut data = vec!; // this is the backing store
// acquire(&mut data); // this function populates the backing store with the image pixels
let img = new.unwrap; // Create a 4x4 image backed by the vector
let img = from; // convert the `ImageRef` object to `DynamicImageRef`
let img = img.debayer.expect; // debayer the image using nearest neighbor method
let mut img = new; // Convert to a GenericImageRef
// insert the camera information as metadata
img.insert_key;
let json = to_string.unwrap; // serialize the image to JSON
let rimg: GenericImageOwned = from_str.unwrap; // deserialize to GenericImageOwned
assert_eq!; // Confirm that deserialized image matches the original
The intention behind *ImageRef
is to minimize unnecessary allocations.
GenericImageOwned
and other ImageOwned
types
An image can be loaded using the image
crate from disk, by enabling the image
feature:
use DynamicImageOwned;
use open;
let img = open.expect;
let img = try_from.expect;
Loading and storing a GenericImageRef
A GenericImageRef
is intended to be loaded and stored in a standard format, e.g. bincode - which follows trivially from the serialization of GenericImageRef
. However, for more portable applications, with the fitsio
feature, a GenericImageRef
can be stored as a FITS file by importing the FitsWrite
trait.
The FITS file is stored using the fitsio
crate, which is a thin wrapper around the cfitsio
library.
use ; // we need the FitsWrite trait to be able to use the `write_fits` method.
use Path;
let img: GenericImageRef = ; // obtain a GenericImageRef
img.write_fits // no compression, overwrite
.expect;
Additional Features
ToLuma
trait is implemented on all image functions.
Luminance calculation is done in-place.
Optional Features
Features are available to extend the functionalities of the core refimage
data types:
rayon
: Parallelizesto_luma
,to_luma_custom
,to_u8
anddebayer
functions (enabled by default).serde_flate
: Compresses the data using deflate during serialization (enabled by default).fitsio
: ExposesFitsWrite
trait to writeGenericImageRef
andGenericImageOwned
(disabled by default).image
: EnablesTryFrom
conversions betweenimage::DynamicImage
andrefimage::DynamicImageRef
,refimage::DynamicImageOwned
(disabled by default).