- try to use array views
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "tiffwrite"
|
name = "tiffwrite"
|
||||||
version = "2024.10.6"
|
version = "2024.10.7"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Wim Pomp <w.pomp@nki.nl>"]
|
authors = ["Wim Pomp <w.pomp@nki.nl>"]
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|||||||
16
src/lib.rs
16
src/lib.rs
@@ -3,7 +3,7 @@ mod py;
|
|||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use ndarray::{s, Array2};
|
use ndarray::{s, Array2, ArrayView2};
|
||||||
use num::{traits::ToBytes, Complex, FromPrimitive, Rational32, Zero};
|
use num::{traits::ToBytes, Complex, FromPrimitive, Rational32, Zero};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
@@ -632,17 +632,18 @@ impl IJTiffFile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn save<T>(&mut self, frame: Array2<T>, c: usize, z: usize, t: usize) -> Result<()>
|
pub fn save<T>(&mut self, frame: ArrayView2<T>, c: usize, z: usize, t: usize) -> Result<()>
|
||||||
where
|
where
|
||||||
T: Bytes + Clone + Send + Sync + Zero + 'static,
|
T: Bytes + Clone + Send + Zero + 'static,
|
||||||
{
|
{
|
||||||
self.compress_frame(frame.reversed_axes(), c, z, t)?;
|
self.compress_frame(frame.reversed_axes(), c, z, t)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compress_frame<T>(&mut self, frame: Array2<T>, c: usize, z: usize, t: usize) -> Result<()>
|
fn compress_frame<T>(&mut self, frame: ArrayView2<T>,
|
||||||
|
c: usize, z: usize, t: usize) -> Result<()>
|
||||||
where
|
where
|
||||||
T: Bytes + Clone + Zero + Send + 'static,
|
T: Bytes + Clone + Send + Zero + 'static,
|
||||||
{
|
{
|
||||||
fn compress<T>(frame: Array2<T>, compression_level: i32) -> CompressedFrame
|
fn compress<T>(frame: Array2<T>, compression_level: i32) -> CompressedFrame
|
||||||
where
|
where
|
||||||
@@ -657,7 +658,7 @@ impl IJTiffFile {
|
|||||||
)
|
)
|
||||||
.max(16)
|
.max(16)
|
||||||
.min(1024);
|
.min(1024);
|
||||||
let tiles = IJTiffFile::tile(frame.reversed_axes(), tile_size);
|
let tiles = IJTiffFile::tile(frame.view().reversed_axes(), tile_size);
|
||||||
let byte_tiles: Vec<Vec<u8>> = tiles
|
let byte_tiles: Vec<Vec<u8>> = tiles
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|tile| tile.map(|x| x.bytes()).into_iter().flatten().collect())
|
.map(|tile| tile.map(|x| x.bytes()).into_iter().flatten().collect())
|
||||||
@@ -690,6 +691,7 @@ impl IJTiffFile {
|
|||||||
sleep(Duration::from_millis(100));
|
sleep(Duration::from_millis(100));
|
||||||
}
|
}
|
||||||
let compression_level = self.compression_level;
|
let compression_level = self.compression_level;
|
||||||
|
let frame = frame.to_owned();
|
||||||
self.threads.insert(
|
self.threads.insert(
|
||||||
(c, z, t),
|
(c, z, t),
|
||||||
thread::spawn(move || compress(frame, compression_level)),
|
thread::spawn(move || compress(frame, compression_level)),
|
||||||
@@ -729,7 +731,7 @@ impl IJTiffFile {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tile<T: Clone + Zero>(frame: Array2<T>, size: usize) -> Vec<Array2<T>> {
|
fn tile<T: Clone + Zero>(frame: ArrayView2<T>, size: usize) -> Vec<Array2<T>> {
|
||||||
let shape = frame.shape();
|
let shape = frame.shape();
|
||||||
let (n, m) = (shape[0] / size, shape[1] / size);
|
let (n, m) = (shape[0] / size, shape[1] / size);
|
||||||
let mut tiles = Vec::new();
|
let mut tiles = Vec::new();
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ fn main() -> Result<()> {
|
|||||||
arr[[i, j]] = i as u16;
|
arr[[i, j]] = i as u16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.save(arr.to_owned(), 0, 0, 0)?;
|
f.save(arr.view(), 0, 0, 0)?;
|
||||||
|
|
||||||
let mut arr = Array2::<u16>::zeros((100, 100));
|
let mut arr = Array2::<u16>::zeros((100, 100));
|
||||||
arr.slice_mut(s![64.., ..64]).fill(1);
|
arr.slice_mut(s![64.., ..64]).fill(1);
|
||||||
arr.slice_mut(s![..64, 64..]).fill(2);
|
arr.slice_mut(s![..64, 64..]).fill(2);
|
||||||
arr.slice_mut(s![64.., 64..]).fill(3);
|
arr.slice_mut(s![64.., 64..]).fill(3);
|
||||||
f.save(arr.to_owned(), 1, 0, 0)?;
|
f.save(arr.view(), 1, 0, 0)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ macro_rules! impl_save {
|
|||||||
z: usize,
|
z: usize,
|
||||||
) -> PyResult<()> {
|
) -> PyResult<()> {
|
||||||
if let Some(ijtifffile) = self.ijtifffile.as_mut() {
|
if let Some(ijtifffile) = self.ijtifffile.as_mut() {
|
||||||
ijtifffile.save(frame.to_owned_array(), c, t, z)?;
|
ijtifffile.save(frame.as_array(), c, t, z)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user