1use std::io::{BufReader, Cursor, Seek, Write};
2
3use crate::{Array, array_type, error::Error};
4
5use super::{Limits, ReadAt, Reader, Writer};
6
7impl From<Limits> for image::Limits {
8 fn from(value: Limits) -> Self {
9 let mut out = Self::no_limits();
10 out.max_alloc = value.image_bytes;
11 out.max_image_width = value.image_dim;
12 out.max_image_height = value.image_dim;
13 out
14 }
15}
16
17impl<R: ReadAt> Reader<R> {
18 pub fn image(&self, image: &Array<array_type::Image>) -> Result<image::DynamicImage, Error> {
20 let f = BufReader::new(self.array_bytes_reader(image)?);
21 let mut reader = image::ImageReader::new(f).with_guessed_format()?;
22 reader.limits(self.limits().into());
23 Ok(reader.decode()?)
24 }
25}
26
27impl<W: Write + Seek> Writer<W> {
28 pub fn image_png(
32 &mut self,
33 image: &image::DynamicImage,
34 ) -> Result<Array<array_type::Image>, Error> {
35 let mut bytes = Vec::new();
36 image.write_to(&mut Cursor::new(&mut bytes), image::ImageFormat::Png)?;
37 self.image_bytes(&bytes)
38 }
39
40 pub fn image_jpeg(
51 &mut self,
52 image: &image::RgbImage,
53 quality: u8,
54 ) -> Result<Array<array_type::Image>, Error> {
55 let mut bytes = Vec::new();
56 image.write_with_encoder(image::codecs::jpeg::JpegEncoder::new_with_quality(
57 &mut Cursor::new(&mut bytes),
58 quality.clamp(1, 100),
59 ))?;
60 self.image_bytes(&bytes)
61 }
62}