summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorDylan <boss@tehbox.org>2026-06-21 15:01:28 +1200
committerDylan <boss@tehbox.org>2026-06-21 15:03:02 +1200
commita472b1cdaa8a1f72b96988009b3d4d9820e7128f (patch)
tree833959761c3c1f60c60425bdc7553162cacb3f2d /src/main.rs
parent14de6db28fb689cdb066c5b01a2885b6a6a35157 (diff)
downloadtehimage-rs-a472b1cdaa8a1f72b96988009b3d4d9820e7128f.tar.gz
tehimage-rs-a472b1cdaa8a1f72b96988009b3d4d9820e7128f.zip
feat: Added bitmap writing
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs187
1 files changed, 10 insertions, 177 deletions
diff --git a/src/main.rs b/src/main.rs
index c348e77..2d68a02 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,185 +1,18 @@
-// #![allow(dead_code)]
-
-use crate::reader::FileReader;
-use std::{fs::File, io::BufReader, ops::{self}};
+use crate::{bmp::BMPImage, image::Image, reader::FileReader, writer::FileWriter};
+use std::{fs::File, io::{BufReader, BufWriter}};
mod reader;
-
-// #[derive(Debug)]
-// struct RGB<T: Add<Output = T> + Copy>
-// {
-// r: T,
-// g: T,
-// b: T
-// }
-
-trait ColorDepth: Clone
-{
- const DEFAULT: Self;
-}
-impl ColorDepth for u8 {
- const DEFAULT: Self = 0;
-}
-impl ColorDepth for u16 {
- const DEFAULT: Self = 0;
-}
-impl ColorDepth for u32 {
- const DEFAULT: Self = 0;
-}
-
-#[derive(Debug, Clone)]
-struct RGBA<T: ColorDepth>
-{
- r: T,
- g: T,
- b: T,
- a: T
-}
-#[derive(Debug, Clone)]
-struct RGB<T: ColorDepth>
-{
- r: T,
- g: T,
- b: T,
-}
-
-trait ColorType: Clone
-{
- const DEFAULT: Self;
-}
-impl<T: ColorDepth> ColorType for RGBA<T>
-{
- const DEFAULT: Self = Self { r: T::DEFAULT, g: T::DEFAULT, b: T::DEFAULT, a: T::DEFAULT };
-}
-impl<T: ColorDepth> ColorType for RGB<T>
-{
- const DEFAULT: Self = Self { r: T::DEFAULT, g: T::DEFAULT, b: T::DEFAULT};
-}
-
-#[derive(Debug)]
-struct PixelArr<T: ColorType>
-{
- width: u32,
- height: u32,
- raw: Vec<T>
-}
-impl<T: ColorType> PixelArr<T> {
- fn new(width: u32, height: u32) -> Self {
- let raw = vec![T::DEFAULT;(width*height) as usize];
- Self { width, height, raw }
- }
-}
-impl<T: ColorType> ops::Index<(usize, usize)> for PixelArr<T>
-{
- type Output = T;
-
- fn index(&self, index: (usize, usize)) -> &Self::Output {
- let (x, y) = index;
- &self.raw[x + y*(self.width as usize)]
- }
-}
-impl<T: ColorType> ops::IndexMut<(usize, usize)> for PixelArr<T>
-{
- fn index_mut(&mut self, index: (usize, usize)) -> &mut T {
- let (x, y) = index;
- &mut self.raw[x + y*(self.width as usize)]
- }
-}
-
-#[derive(Debug)]
-struct ImageBase
-{
- width: u32,
- height: u32,
- bit_depth: u8,
- pixels: PixelArr<RGB<u8>>
-}
-
-struct BMPImage
-{
-}
-
-
-trait Image
-{
- fn read_image(reader: &mut FileReader) -> Result<ImageBase, &'static str>;
-}
-
-impl Image for BMPImage
-{
- fn read_image(reader: &mut FileReader) -> Result<ImageBase, &'static str>
- {
- let magic: [u8; 2] = reader.read_array();
- if magic != [0x42, 0x4d]
- {
- return Err("Not a bitmap!");
- }
-
- let _file_size: u32 = reader.read();
- reader.skip(4);
- let _offset: u32 = reader.read();
-
- let header_size: u32 = reader.read();
-
- // println!("File header: {file_size} {offset} {header_size}");
-
- if header_size == 40
- {
-
- let width: u32 = reader.read();
- let height: u32 = reader.read();
- let _color_planes: u16 = reader.read();
- let bpp = reader.read::<2, u16>() as u8;
- let compression_method: u32 = reader.read();
- let _image_size: u32 = reader.read();
- let _horr_res: u32 = reader.read();
- let _vert_res: u32 = reader.read();
- let _color_count: u32 = reader.read();
- let _impotant_color_count: u32 = reader.read();
-
- if
- bpp != 24
- || compression_method != 0
- {
- return Err("bpp or compresssion method not supported")
- }
-
- let row_size = (((bpp as u32) * width + 31)/32) * 4;
- let skip: usize = (row_size - width * 3) as usize;
- let mut pixel_arr = PixelArr::new(width, height);
- for y in (0..height).rev()
- {
- for x in 0..width
- {
- let mut pixel = RGB::DEFAULT;
- pixel.b = reader.read();
- pixel.g = reader.read();
- pixel.r = reader.read();
- pixel_arr[(x as usize, y as usize)] = pixel;
- }
- reader.skip(skip);
- }
-
- return Ok(ImageBase
- {
- width,
- height,
- bit_depth: bpp,
- pixels: pixel_arr,
- })
- }
- else
- {
- return Err("Header size not supported yet");
- }
-
-
- }
-}
+mod image;
+mod bmp;
+mod writer;
fn main() {
let file = File::open("smiley.bmp").expect("File does not exist");
let mut reader = FileReader::new(BufReader::new(file));
let _bmp = BMPImage::read_image(&mut reader).expect("Bitmap had error");
- // println!("{bmp:?}");
+
+ let out_file = File::create("tmp.bmp").expect("Cannot create fiel");
+ let mut writer = FileWriter::new(BufWriter::new(out_file));
+ BMPImage::write_image(&_bmp, &mut writer);
+ // println!("{_bmp:?}");
}