mod reader;
mod magic;
mod structs;
mod encoder;
use std::io::{Read, Write};
use structs::*;
use encoder::{encode_auto, encode_auto_select};
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 3 {
eprintln!("Usage: {} <input> <output>", args[0]);
std::process::exit(1);
}
if !std::path::Path::new(&args[1]).exists() {
eprintln!("File not found: {}", args[1]);
std::process::exit(1);
}
let im_info: ImageInfo;
let file = std::fs::File::open(&args[1]).unwrap();
let mut buf = Vec::new();
let mut reader = std::io::BufReader::new(file);
reader.read_to_end(&mut buf).unwrap();
let file_type = magic::detect_file_type_with_magic_number(&buf);
if file_type.is_err() {
eprintln!("Unsupported file type");
std::process::exit(1);
}
println!("File type: {}", file_type.unwrap());
println!("Input size: {}", buf.len());
match file_type.unwrap() {
"jpeg" => {
todo!();
},
_ => {
im_info = reader::read(&buf).unwrap();
}
}
println!("Image size: {}x{}", im_info.width, im_info.height);
println!("Bit depth: {}", im_info.bit_depth);
println!("Color type: {}", match im_info.color_type {
0 => "Grayscale",
2 => "RGB",
3 => "Indexed",
4 => "GrayscaleAlpha",
6 => "RGBA",
_ => "Unknown",
});
let compression_config = CompressionConfig::default();
let decide = encode_auto_select(&im_info, &compression_config);
println!("Auto-decided file type: {}", decide);
let auto_decide_res = encode_auto(im_info, compression_config);
println!("Output size: {}", auto_decide_res.1.len());
let new_file_name = args[2].as_str().to_owned() + "." + &auto_decide_res.0;
let output_file = std::fs::File::create(new_file_name).unwrap();
let mut writer = std::io::BufWriter::new(output_file);
writer.write_all(&auto_decide_res.1).unwrap();
}