Skip to content

Commit

Permalink
Improved memory efficiency of loading images
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanRace committed Nov 16, 2022
1 parent b691b23 commit a726029
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
2 changes: 1 addition & 1 deletion lib/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "imc-rs"
version = "0.1.4"
version = "0.1.5"
edition = "2021"
authors = ["Alan Race <alan.race@uni-marburg.de>"]
homepage = "https://github.com/AlanRace/imc-rs"
Expand Down
2 changes: 1 addition & 1 deletion lib/src/convert/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::{
collections::HashMap,
fs::File,
io::{BufReader, BufWriter, Cursor, Read, Seek, SeekFrom, Write},
io::{BufReader, Cursor, Read, Seek, SeekFrom, Write},
sync::{Arc, Mutex},
};

Expand Down
27 changes: 17 additions & 10 deletions lib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ use std::collections::HashMap;
use calibration::{Calibration, CalibrationChannel, CalibrationFinal, CalibrationParams};
use mcd::{MCDParser, ParserState};

use image::{DynamicImage, ImageFormat, RgbaImage};
use image::{DynamicImage, ImageFormat, RgbImage, RgbaImage};
use slide::{SlideFiducialMarks, SlideProfile};
use transform::AffineTransform;

Expand Down Expand Up @@ -129,20 +129,27 @@ impl<R: Read + Seek> OpticalImage<R> {

/// Returns a decoded RgbaImage of the panorama image
pub fn as_rgba8(&self) -> Result<RgbaImage> {
// match self.dynamic_image()? {
// DynamicImage::ImageRgba8(rgba8) => Ok(rgba8),
// DynamicImage::ImageRgb8(rgb8) => Ok(DynamicImage::ImageRgb8(rgb8).into_rgba8()),
// _ => panic!("Unexpected DynamicImage type"),
// }
Ok(self.dynamic_image()?.into_rgba8())
}

/// Returns a decoded RgbImage of the panorama image
pub fn as_rgb8(&self) -> Result<RgbImage> {
Ok(self.dynamic_image()?.into_rgb8())
}

fn dynamic_image(&self) -> Result<DynamicImage> {
let mut reader = ImageReader::new(Cursor::new(self.image_data()?));
reader.set_format(self.image_format);
let mut reader = self.reader.lock().or(Err(MCDError::PoisonMutex))?;
let start_offset = self.start_offset();

// TODO: Deal with this error properly
Ok(reader.decode()?)
match reader.seek(SeekFrom::Start(start_offset as u64)) {
Ok(_seek) => {
let mut reader = ImageReader::new(reader.deref_mut());
reader.set_format(self.image_format);

Ok(reader.decode()?)
}
Err(error) => Err(error.into()),
}
}
}

Expand Down

0 comments on commit a726029

Please sign in to comment.