use std::{fmt, io::Cursor, ops::Deref};
use image::{DynamicImage, ImageReader};
use serde::{de::{self, Visitor}, Deserialize};
#[derive(Clone, Debug)]
pub struct DynamicImageExt {
image: DynamicImage,
}
impl Deref for DynamicImageExt {
type Target = DynamicImage;
fn deref(&self) -> &Self::Target {
&self.image
}
}
impl <'de> Deserialize<'de> for DynamicImageExt {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: de::Deserializer<'de> {
deserializer.deserialize_bytes(DynamicImageExtVisitor)
}
}
struct DynamicImageExtVisitor;
impl<'de> Visitor<'de> for DynamicImageExtVisitor {
type Value = DynamicImageExt;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a «data» field containing a TIFF")
}
fn visit_byte_buf<E>(self, v: Vec<u8>) -> std::result::Result<Self::Value, E>
where
E: de::Error, {
let mut reader = ImageReader::new(Cursor::new(v));
reader.set_format(image::ImageFormat::Tiff);
Ok(DynamicImageExt { image: reader.decode().unwrap() })
}
}