1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::io::Write; pub mod pixel; pub mod header; use header::Header; use pixel::Pixel; pub mod utils; use utils::*; mod rotate; use rotate::rotate; pub struct Img { header: Header, pub pixels: Vec<Vec<Pixel>> } impl Img { pub fn new(pixels: Vec<Vec<Pixel>>) -> Img { let height = pixels.len() as u32; let width = pixels[0].len() as u32; let header = Header::new(width, height, width * height); Img { header: header, pixels: pixels } } pub fn get_binary_data(&self) -> Vec<u8>{ let mut data = self.header.get_binary_data(); for i in (0..self.pixels.len()).rev(){ for pixel in self.pixels[i].iter() { data.push(pixel.b); data.push(pixel.g); data.push(pixel.r); } for _i in 0..(4 - (self.pixels[0].len() as u32 * 3) % 4){ if (self.pixels[0].len() as u32 * 3) % 4 == 0 { break; } data.push(0); } } let mut size = transform_u32_to_array_of_u8(data.len() as u32); for i in 0..4 { data[i+2] = size[i]; } size = transform_u32_to_array_of_u8(self.pixels.len() as u32 * ((self.pixels[0].len() as u32 * 3 + 7) & !7) as u32 / 16); for i in 0..4 { data[i+34] = size[i]; } data } pub fn write_image(&self, path: &str){ if !path.contains(".bmp") { panic!("I am not a bmp image!"); } let width = self.pixels[0].len(); for row in self.pixels.iter(){ if row.len() != width { panic!("The pixel array does not have equal row sizes!") } } let mut data = std::fs::File::create(path).unwrap(); let img = Img::new(self.pixels.clone()); let bdata = img.get_binary_data(); data.write(&bdata).unwrap(); } pub fn rotate(&mut self){ self.pixels = rotate(&mut self.pixels); } }