From 7a7bf564e07b88935d32a34977acba8832ecc66a Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Wed, 21 May 2025 16:27:25 +1200 Subject: [PATCH 1/2] Add utility function to read TIFF files from remote object stores Also enable http feature for object_store --- Cargo.toml | 2 +- tests/util/mod.rs | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tests/util/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 46707d2..3c58d05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ tokio = { version = "1.43.0", optional = true, default-features = false, feature weezl = "0.1.0" [dev-dependencies] -object_store = "0.12" +object_store = { version = "0.12", features = ["http"] } tiff = "0.9.1" tokio = { version = "1.9", features = [ "macros", diff --git a/tests/util/mod.rs b/tests/util/mod.rs new file mode 100644 index 0000000..8b3fa07 --- /dev/null +++ b/tests/util/mod.rs @@ -0,0 +1,24 @@ +use std::sync::Arc; + +use async_tiff::metadata::{PrefetchBuffer, TiffMetadataReader}; +use async_tiff::reader::{AsyncFileReader, ObjectReader}; +use async_tiff::TIFF; +use reqwest::Url; + +pub(crate) async fn open_remote_tiff(url: &str) -> TIFF { + let parsed_url = Url::parse(url).expect("failed parsing url"); + let (store, path) = object_store::parse_url(&parsed_url).unwrap(); + + let reader = Arc::new(ObjectReader::new(Arc::new(store), path)) as Arc; + let prefetch_reader = PrefetchBuffer::new(reader.clone(), 32 * 1024) + .await + .unwrap(); + let mut metadata_reader = TiffMetadataReader::try_open(&prefetch_reader) + .await + .unwrap(); + let ifds = metadata_reader + .read_all_ifds(&prefetch_reader) + .await + .unwrap(); + TIFF::new(ifds) +} From a402f44671d01050164656af1b940a5a057dff88 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Wed, 21 May 2025 16:25:23 +1200 Subject: [PATCH 2/2] Add test for opening single-channel OME-TIFF file --- tests/ome_tiff.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/ome_tiff.rs diff --git a/tests/ome_tiff.rs b/tests/ome_tiff.rs new file mode 100644 index 0000000..4e332ab --- /dev/null +++ b/tests/ome_tiff.rs @@ -0,0 +1,21 @@ +/// Integration tests on OME-TIFF files. +use async_tiff::tiff::tags::PhotometricInterpretation; + +mod util; + +#[tokio::test] +async fn test_ome_tiff_single_channel() { + let tiff = + util::open_remote_tiff("https://downloads.openmicroscopy.org/images/OME-TIFF/2016-06/bioformats-artificial/single-channel.ome.tif").await; + + assert_eq!(tiff.ifds().len(), 1); + let ifd = &tiff.ifds()[0]; + + assert_eq!( + ifd.photometric_interpretation(), + PhotometricInterpretation::BlackIsZero + ); + assert_eq!(ifd.image_description(), Some("urn:uuid:2bc2aa39-30d2-44ee-8399-c513492dd5de")); + + assert!(ifd.bits_per_sample().iter().all(|x| *x == 8)); +}