Foreign function image handling
This crate provides easy image pixel handling and conversion capabilities in Rust. It is designed to work with image buffers originating from foreign functions, which could be a C API or a camera driver which maps device buffers into userspace.
Pixels are represented as array wrapper types, e.g. [T; 3] would be the inner type for an Rgb pixel. The crate provides iterator extensions so you can easily convert between color formats, e.g. Yuv and Rgb.
Packed and Planar APIs
Packed images have their pixels reside beneath each other in memory while planar images require separate memory planes for pixel components.
For example, a packed RGB image would look like this in memory:
R1G1B1 .. RnGnnn (single memory plane)
whereas a planar YUV420p image would look like this:
Y1Y2 .. Yn | U1U2 .. Un | V1V2 .. Vn (three memory planes)
Usage
Below you can find a quick example usage of this crate. It introduces the basics necessary for image conversion.
use ;
use ;
Benchmark
A benchmark suite is included in this crate. Run it using
$ cargo bench
These are my results for ffimage v0.10.0 on a MacBook Pro 14" (M1 Pro):
| In | Out | 640x480 | 1280x720 |
|---|---|---|---|
| Rgb[u8] | Bgr[u8] | 18.028 µs | 53.882 µs |
| Rgb[u8] | Gray[u8] | 381.48 µs | 1.1442 ms |
| Yuv[u8] | Rgb[u8] | 165.32 µs | 496.33 µs |
| Yuv422[u8] | Rgb[u8] | 1.2097 ms | 3.6284 ms |