Skip to main content

rs_img2pnm/
lib.rs

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}