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