Horizontal predictor (one_byte_predict, all integer TIFFs with Predictor=2): rewrite with explicit [u8; N] accumulator so LLVM unrolls and keeps each channel in a register. For N=3 (RGB8), this replaces a scalar 1-byte-per-iteration loop with a 2x-unrolled 3-register loop. Float predictor (Predictor=3, f16/f32/f64): split deinterleave into per-format functions with plane slicing up front; f32 batches 4 samples through a u128 wide store to eliminate per-sample bounds checks. Thread a reusable scratch buffer through expand_chunk to eliminate per-row heap allocation. Benchmarked on real 21MP photos and GeoTIFF DEMs (vs upstream main): Strip RGB8 deflate+hpred: 253ms -> 224ms (-11%) Strip RGB8 LZW: 405ms -> 370ms (-9%) Tiled RGB8 deflate+hpred: 241ms -> 222ms (-8%) Strip RGB f32 deflate+fpred: 726ms -> 527ms (-27%) Gray f32 tiled 512: 290ms -> 166ms (-43%) Copernicus DEM GeoTIFF: 239ms -> 152ms (-37%) USGS DEM GeoTIFF: 284ms -> 198ms (-30%)
image-tiff
TIFF decoding and encoding library in pure Rust
Supported
Features
- Baseline spec (other than formats and tags listed below as not supported)
- Multipage
- BigTIFF
- Incremental decoding
Formats
This table lists photometric interpretations and sample formats which are supported for encoding and decoding. The entries are ColorType variants for which sample bit depths are supported. Only samples where all bit depths are equal are currently supported. For example, RGB(8) means that the bit depth [8, 8, 8] is supported and will be interpreted as an 8 bit per channel RGB color type.
PhotometricInterpretation |
UINT Format | IEEEFP Format |
|---|---|---|
WhiteIsZero |
Gray(8|16|32|64) | Gray(32|64) |
BlackIsZero |
Gray(8|16|32|64) | Gray(32|64) |
RGB |
RGB(8|16|32|64), RGBA(8|16|32|64) | RGB(32|64), RGBA(32|64) |
RGBPalette |
||
Mask |
||
CMYK |
CMYK(8|16|32|64) | CMYK(32|64) |
CMYKA |
CMYKA(8) | |
YCbCr |
||
CIELab |
Compressions
| Decoding | Encoding | |
|---|---|---|
| None | ✓ | ✓ |
| LZW | ✓ | ✓ |
| Deflate | ✓ | ✓ |
| PackBits | ✓ | ✓ |
| Fax4 | ✓ | not yet |
| JPEG | ✓ | not yet |
| ZSTD | ✓ | not yet |
Not yet supported
Formats and interpretations not listed above or with empty entries are unsupported.
- Baseline tags
ExtraSamples
- Extension tags
Fuzzing
This crate uses cargo-fuzz in order to test the image parser.
After installing it with cargo install cargo-fuzz on a nightly rustc, the
fuzzing harness can be run with recommended settings using
cargo fuzz run decode_image -snone -- -timeout=5.