An async, low-level TIFF reader for Rust and Python.
- Rust documentation
- Python documentation
- For a higher-level Python API to read GeoTIFF files, see
async-geotiff.
- For a higher-level Python API to read GeoTIFF files, see
- Async, read-only support for tiled TIFF images.
- Read directly from object storage providers, via the
object_storecrate. - Separation of concerns between data reading and decoding so that IO-bound and CPU-bound tasks can be scheduled appropriately.
- Support for user-defined decompression algorithms.
- Tile request merging and concurrency.
- Integration with the
ndarraycrate for easy manipulation of decoded image data. - Support for GeoTIFF tag metadata.
# tokio_test::block_on(async {
# use std::sync::Arc;
# use std::env::current_dir;
#
use object_store::local::LocalFileSystem;
use async_tiff::metadata::TiffMetadataReader;
use async_tiff::metadata::cache::ReadaheadMetadataCache;
use async_tiff::reader::ObjectReader;
use async_tiff::TIFF;
let store = Arc::new(LocalFileSystem::new_with_prefix(current_dir().unwrap()).unwrap());
let reader = ObjectReader::new(store, "fixtures/image-tiff/tiled-jpeg-rgb-u8.tif".into());
let cache = ReadaheadMetadataCache::new(reader.clone());
let mut meta = TiffMetadataReader::try_open(&cache).await.unwrap();
let ifds = meta.read_all_ifds(&cache).await.unwrap();
let tiff = TIFF::new(ifds, meta.endianness());
// Fetch and decode a tile
let tile = tiff.ifds()[0].fetch_tile(0, 0, &reader).await.unwrap();
let array = tile.decode(&Default::default()).unwrap();
println!("shape: {:?}, dtype: {:?}", array.shape(), array.data_type());
# })The existing tiff crate is great, but only supports synchronous reading of TIFF files. Furthermore, due to low maintenance bandwidth it is not designed for extensibility (see #250).
This crate was initially forked from the tiff crate, and still maintains some of its TIFF tag parsing code.