diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0c57461 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "qotk" +version = "0.1.0" +edition = "2021" + +[dependencies] +image = "0.25.1" +zstd = {version = "0.13.1", features = ["zstdmt"] } \ No newline at end of file diff --git a/src/decode.rs b/src/decode.rs new file mode 100644 index 0000000..716706c --- /dev/null +++ b/src/decode.rs @@ -0,0 +1,19 @@ +use std::{fs::File, io::Read}; + +use image::RgbaImage; +use zstd::stream::read::Decoder; +pub fn decode(in_path_str: &str, out_path_str: &str) { + let in_file = File::open(in_path_str).unwrap(); + let mut decoder = Decoder::new(in_file).unwrap(); + let mut width_bytes = [0u8; 4]; + let mut height_bytes = [0u8; 4]; + decoder.read_exact(&mut width_bytes).unwrap(); + decoder.read_exact(&mut height_bytes).unwrap(); + let mut img = RgbaImage::new( + u32::from_be_bytes(width_bytes), + u32::from_be_bytes(height_bytes), + ); + decoder.read_exact(&mut img).unwrap(); + decoder.finish(); + img.save(out_path_str).unwrap(); +} diff --git a/src/encode.rs b/src/encode.rs new file mode 100644 index 0000000..c885e2c --- /dev/null +++ b/src/encode.rs @@ -0,0 +1,18 @@ +use image::{io::Reader as ImageReader, GenericImageView}; +use std::fs::File; +use std::io::prelude::*; +use zstd::stream::write::Encoder; + +pub fn encode(in_path_str: &str, out_path_str: &str, level: i32, n_workers: u32) { + let img = ImageReader::open(in_path_str).unwrap().decode().unwrap(); + let (width, height) = &img.dimensions(); + let width_bytes = width.to_be_bytes(); + let height_bytes = height.to_be_bytes(); + let out_file = File::create(out_path_str).unwrap(); + let mut encoder = Encoder::new(out_file, level).unwrap(); /* 1-22 */ + encoder.multithread(n_workers).unwrap(); + encoder.write_all(&width_bytes).unwrap(); + encoder.write_all(&height_bytes).unwrap(); + encoder.write_all(img.into_rgba8().as_raw()).unwrap(); + encoder.finish().unwrap(); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..3ecffd1 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,7 @@ +mod decode; +mod encode; + +fn main() { + encode::encode("in.png", "out.qotk", 30, 28); /* 1-22 */ + decode::decode("out.qotk", "out.png"); +}