use crate::decoder::ImageDecoder;
use crate::error::CodecError;
use crate::options::ImageInfo;
use crate::pixel::ImagePixel;
use edgefirst_tensor::{Tensor, TensorDyn};
use std::io::{BufReader, Read};
use std::path::Path;
pub trait ImageLoad {
fn load_image(&mut self, decoder: &mut ImageDecoder, data: &[u8]) -> crate::Result<ImageInfo>;
fn load_image_read<R: Read>(
&mut self,
decoder: &mut ImageDecoder,
reader: R,
) -> crate::Result<ImageInfo>;
fn load_image_file(
&mut self,
decoder: &mut ImageDecoder,
path: impl AsRef<Path>,
) -> crate::Result<ImageInfo>;
}
impl<T: ImagePixel> ImageLoad for Tensor<T> {
fn load_image(&mut self, decoder: &mut ImageDecoder, data: &[u8]) -> crate::Result<ImageInfo> {
decoder.decode_into(data, self)
}
fn load_image_read<R: Read>(
&mut self,
decoder: &mut ImageDecoder,
reader: R,
) -> crate::Result<ImageInfo> {
decoder.decode_from_reader(reader, self)
}
fn load_image_file(
&mut self,
decoder: &mut ImageDecoder,
path: impl AsRef<Path>,
) -> crate::Result<ImageInfo> {
let file = std::fs::File::open(path.as_ref()).map_err(CodecError::Io)?;
self.load_image_read(decoder, BufReader::new(file))
}
}
impl ImageLoad for TensorDyn {
fn load_image(&mut self, decoder: &mut ImageDecoder, data: &[u8]) -> crate::Result<ImageInfo> {
decoder.decode_into_dyn(data, self)
}
fn load_image_read<R: Read>(
&mut self,
decoder: &mut ImageDecoder,
reader: R,
) -> crate::Result<ImageInfo> {
decoder.decode_from_reader_dyn(reader, self)
}
fn load_image_file(
&mut self,
decoder: &mut ImageDecoder,
path: impl AsRef<Path>,
) -> crate::Result<ImageInfo> {
let file = std::fs::File::open(path.as_ref()).map_err(CodecError::Io)?;
self.load_image_read(decoder, BufReader::new(file))
}
}