1use std::io;
2
3use io::Cursor;
4use io::Seek;
5use io::Write;
6
7use io::Read;
8
9use image::DynamicImage;
10use image::ImageFormat;
11
12pub fn bytes2image(dat: &[u8]) -> Result<DynamicImage, io::Error> {
13 image::load_from_memory(dat).map_err(io::Error::other)
14}
15
16pub fn img2wtr<W>(img: &DynamicImage, wtr: W) -> Result<(), io::Error>
17where
18 W: Write + Seek,
19{
20 img.write_to(wtr, ImageFormat::Pnm)
21 .map_err(io::Error::other)
22}
23
24pub fn reader2bytes<R>(rdr: R, limit: u64) -> Result<Vec<u8>, io::Error>
25where
26 R: Read,
27{
28 let mut taken = rdr.take(limit);
29 let mut buf = vec![];
30 taken.read_to_end(&mut buf)?;
31 Ok(buf)
32}
33
34pub fn stdin2bytes(limit: u64) -> Result<Vec<u8>, io::Error> {
35 reader2bytes(io::stdin().lock(), limit)
36}
37
38pub fn stdin2img(limit: u64) -> Result<DynamicImage, io::Error> {
39 let imgdat: Vec<u8> = stdin2bytes(limit)?;
40 bytes2image(&imgdat)
41}
42
43pub fn img2stdout(img: &DynamicImage) -> Result<(), io::Error> {
44 let buf: Vec<u8> = vec![];
45 let mut cur = Cursor::new(buf);
46 img2wtr(img, &mut cur)?;
47 let wrote: Vec<u8> = cur.into_inner();
48 let o = io::stdout();
49 let mut ol = o.lock();
50 ol.write_all(&wrote)?;
51 ol.flush()
52}
53
54pub fn stdin2img2pnm(limit: u64) -> Result<(), io::Error> {
55 let img: DynamicImage = stdin2img(limit)?;
56 img2stdout(&img)
57}