Add method to retrieve planes of a tile
This is well-defined even if we add sub-sampling support later on. We can adjust the layout type accordingly with factors per each plane. Note that the layout, in theory, does not depend on the index of the unit if we describe all planes for a multi-planar layout. The specification requires that the subsampling factors divide the tile sizes. However we have to handle non-planar images here and this leaves us open to other potential parameters.
This commit is contained in:
1 parent
5b9dc30919
commit
1f02ff8ca1
4 files changed
+181
-26
No files matched your search
+45
-1
@@ -1,4 +1,4 @@
|
||||
use tiff::decoder::Decoder;
|
||||
use tiff::decoder::{Decoder, TiffCodingUnit};
|
||||
|
||||
use std::fs::File;
|
||||
use std::path::PathBuf;
|
||||
@@ -30,3 +30,47 @@ fn read_all_planes() {
|
||||
assert_eq!(sum, expected);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn read_first_coding_unit() {
|
||||
let path = PathBuf::from(TEST_IMAGE_DIR).join("planar-rgb-u8.tif");
|
||||
let file = File::open(path).unwrap();
|
||||
let io = std::io::BufReader::new(file);
|
||||
|
||||
let mut tif = Decoder::new(io).unwrap();
|
||||
let layout = tif.image_coding_unit_layout(TiffCodingUnit(0)).unwrap();
|
||||
|
||||
assert_eq!(layout.planes, 3);
|
||||
let plane_stride = layout.plane_stride.map_or(0, |x| x.get());
|
||||
eprintln!("{:?}", layout);
|
||||
let mut buffer = vec![0u8; layout.complete_len];
|
||||
|
||||
struct Expected {
|
||||
plane_sums: [u32; 3],
|
||||
unit: TiffCodingUnit,
|
||||
}
|
||||
|
||||
// Mainly you can see: these are different and non-zero. Otherwise these magic constants just
|
||||
// depend on the file itself that is being used. Also this varies by what unit we are reading.
|
||||
const PLANE_EXCPECTED_SUMS: [Expected; 2] = [
|
||||
Expected {
|
||||
plane_sums: [856853, 767686, 688532],
|
||||
unit: TiffCodingUnit(0),
|
||||
},
|
||||
Expected {
|
||||
plane_sums: [883679, 797329, 711086],
|
||||
unit: TiffCodingUnit(1),
|
||||
},
|
||||
];
|
||||
|
||||
for expected in PLANE_EXCPECTED_SUMS {
|
||||
tif.read_coding_unit_bytes(expected.unit, &mut buffer)
|
||||
.unwrap();
|
||||
|
||||
for (plane, expected) in (0..layout.planes).zip(expected.plane_sums) {
|
||||
let plane_data = &buffer[plane_stride * plane..][..layout.len];
|
||||
let sum: u32 = plane_data.iter().copied().map(u32::from).sum();
|
||||
assert_eq!(sum, expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user