use std::path::PathBuf; use serde_derive::{Serialize, Deserialize}; use std::fs::read_to_string; use image::{DynamicImage, ImageBuffer}; use crate::Palette; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct Image { pub name: String, /// colour indices - todo convert to [u8; 64]? pub pixels: Vec, } impl Image { pub fn from_file(path: PathBuf) -> Self { let name = path.file_stem().unwrap().to_str().unwrap().into(); let mut pixels: Vec = Vec::new(); // todo .matches [0..3] instead of replacing whitespace? for char in read_to_string(&path).unwrap().replace('\n', "").chars() { pixels.push(char.to_string().parse().unwrap()); } Self { name, pixels } } pub fn into_image(self, palette: &Palette) -> DynamicImage { let mut buffer: Vec = Vec::new(); for pixel in self.pixels { buffer.append(&mut palette.get_colour_rgba8(&pixel)); } DynamicImage::ImageRgba8(ImageBuffer::from_raw(8, 8, buffer).unwrap()) } } #[cfg(test)] mod test { use std::path::PathBuf; use crate::image::Image; #[test] fn image_from_text() { let path = PathBuf::from("src/test-resources/basic/images/avatar.txt"); let output = Image::from_file(path); let expected = crate::mock::image::avatar(); assert_eq!(output, expected); } #[test] fn image_to_dynamic_image() { let palette = &crate::mock::palette::default(); let output = crate::mock::image::avatar().into_image(palette); let expected = image::io::Reader::open( "src/test-resources/images/avatar.png" ).unwrap().decode().unwrap(); assert_eq!(output, expected); } }