use std::fs::File;
use std::io::Write;
use std::path::Path;
pub fn write_bmp(
path: impl AsRef<Path>,
width: u32,
height: u32,
stride: usize,
data: &[u8],
) -> std::io::Result<()> {
let mut file = File::create(path)?;
let bpp: u16 = 32;
let dib_header_size: u32 = 40;
let masks_size: u32 = 12; let pixel_offset: u32 = 14 + dib_header_size + masks_size;
let pixel_data_size = stride as u32 * height;
let file_size = pixel_offset + pixel_data_size;
file.write_all(b"BM")?;
file.write_all(&file_size.to_le_bytes())?;
file.write_all(&0u16.to_le_bytes())?; file.write_all(&0u16.to_le_bytes())?; file.write_all(&pixel_offset.to_le_bytes())?;
file.write_all(&dib_header_size.to_le_bytes())?;
file.write_all(&(width as i32).to_le_bytes())?;
file.write_all(&(-(height as i32)).to_le_bytes())?;
file.write_all(&1u16.to_le_bytes())?; file.write_all(&bpp.to_le_bytes())?;
file.write_all(&3u32.to_le_bytes())?; file.write_all(&pixel_data_size.to_le_bytes())?;
file.write_all(&2835u32.to_le_bytes())?; file.write_all(&2835u32.to_le_bytes())?; file.write_all(&0u32.to_le_bytes())?; file.write_all(&0u32.to_le_bytes())?;
file.write_all(&0x00FF_0000u32.to_le_bytes())?; file.write_all(&0x0000_FF00u32.to_le_bytes())?; file.write_all(&0x0000_00FFu32.to_le_bytes())?;
file.write_all(data)?;
Ok(())
}