# Immo Rusty safety image modification library # How to use Here's an example of a PNG image ```rust use png::text_metadata::{ITXtChunk, ZTXtChunk}; use std::env; use std::fs::File; use std::io::BufWriter; use std::time::Instant; use immo::error::ImageError; use immo::png::Png; const BLACK: (u8, u8, u8, u8) = (0, 0, 0, 255); const WHITE: (u8, u8, u8, u8) = (255,255,255,255); const LIGHT_AQUA: (u8, u8, u8, u8) = (170,222,240,255); const DARK_AQUA: (u8, u8, u8, u8) = (0,140,180,255); const AQUA: (u8, u8, u8, u8) = (0,222,255,255); fn main() -> Result<(),ImageError>{ let start = Instant::now(); let mut png = Png::new(16,16); png.point(4,3,BLACK)?; png.point(5,3,BLACK)?; png.point(6,3,BLACK)?; png.point(7,3,BLACK)?; png.point(8,3,BLACK)?; png.point(9,3,BLACK)?; png.point(10,3,BLACK)?; png.point(11,3,BLACK)?; png.point(3,4,BLACK)?; png.point(4,4,WHITE)?; png.point(5,4,LIGHT_AQUA)?; png.point(6,4,WHITE)?; png.point(7,4,AQUA)?; png.point(8,4,AQUA)?; png.point(9,4,DARK_AQUA)?; png.point(10,4,LIGHT_AQUA)?; png.point(11,4,AQUA)?; png.point(12,4,BLACK)?; png.point(2,5,BLACK)?; png.point(3,5,WHITE)?; png.point(4,5,LIGHT_AQUA)?; png.point(5,5,WHITE)?; png.point(6,5,AQUA)?; png.point(7,5,AQUA)?; png.point(8,5,LIGHT_AQUA)?; png.point(9,5,LIGHT_AQUA)?; png.point(10,5,DARK_AQUA)?; png.point(11,5,LIGHT_AQUA)?; png.point(12,5,DARK_AQUA)?; png.point(13,5,BLACK)?; png.point(1,6,BLACK)?; png.point(2,6,WHITE)?; png.point(3,6,LIGHT_AQUA)?; png.point(4,6,WHITE)?; png.point(5,6,AQUA)?; png.point(6,6,WHITE)?; png.point(7,6,WHITE)?; png.point(8,6,WHITE)?; png.point(9,6,WHITE)?; png.point(10,6,LIGHT_AQUA)?; png.point(11,6,DARK_AQUA)?; png.point(12,6,LIGHT_AQUA)?; png.point(13,6,AQUA)?; png.point(14,6,BLACK)?; png.point(0,7,BLACK)?; png.point(1,7,DARK_AQUA)?; png.point(2,7,DARK_AQUA)?; png.point(3,7,DARK_AQUA)?; png.point(4,7,DARK_AQUA)?; png.point(5,7,AQUA)?; png.point(6,7,AQUA)?; png.point(7,7,AQUA)?; png.point(8,7,AQUA)?; png.point(9,7,DARK_AQUA)?; png.point(10,7,DARK_AQUA)?; png.point(11,7,DARK_AQUA)?; png.point(12,7,DARK_AQUA)?; png.point(13,7,DARK_AQUA)?; png.point(14,7,DARK_AQUA)?; png.point(15,7,BLACK)?; png.point(1,8,BLACK)?; png.point(2,8,AQUA)?; png.point(3,8,LIGHT_AQUA)?; png.point(4,8,LIGHT_AQUA)?; png.point(5,8,AQUA)?; png.point(6,8,LIGHT_AQUA)?; png.point(7,8,LIGHT_AQUA)?; png.point(8,8,WHITE)?; png.point(9,8,AQUA)?; png.point(10,8,WHITE)?; png.point(11,8,DARK_AQUA)?; png.point(12,8,LIGHT_AQUA)?; png.point(13,8,DARK_AQUA)?; png.point(14,8,BLACK)?; png.point(2,9,BLACK)?; png.point(3,9,LIGHT_AQUA)?; png.point(4,9,LIGHT_AQUA)?; png.point(5,9,LIGHT_AQUA)?; png.point(6,9,LIGHT_AQUA)?; png.point(7,9,AQUA)?; png.point(8,9,LIGHT_AQUA)?; png.point(9,9,AQUA)?; png.point(10,9,AQUA)?; png.point(11,9,DARK_AQUA)?; png.point(12,9,DARK_AQUA)?; png.point(13,9,BLACK)?; png.point(3,10,BLACK)?; png.point(4,10,AQUA)?; png.point(5,10,LIGHT_AQUA)?; png.point(6,10,LIGHT_AQUA)?; png.point(7,10,LIGHT_AQUA)?; png.point(8,10,AQUA)?; png.point(9,10,AQUA)?; png.point(10,10,DARK_AQUA)?; png.point(11,10,LIGHT_AQUA)?; png.point(12,10,BLACK)?; png.point(4,11,BLACK)?; png.point(5,11,AQUA)?; png.point(6,11,AQUA)?; png.point(7,11,DARK_AQUA)?; png.point(8,11,AQUA)?; png.point(9,11,DARK_AQUA)?; png.point(10,11,LIGHT_AQUA)?; png.point(11,11,BLACK)?; png.point(5,12,BLACK)?; png.point(6,12,DARK_AQUA)?; png.point(7,12,DARK_AQUA)?; png.point(8,12,LIGHT_AQUA)?; png.point(9,12,LIGHT_AQUA)?; png.point(10,12,BLACK)?; png.point(6,13,BLACK)?; png.point(7,13,LIGHT_AQUA)?; png.point(8,13,DARK_AQUA)?; png.point(9,13,BLACK)?; png.point(7,14,BLACK)?; png.point(8,14,BLACK)?; let path = String::from("sample.png"); let file = File::create(path).unwrap(); let w = &mut BufWriter::new(file); let mut encoder = png::Encoder::new(w, 16,16); // Width is 2 pixels and height is 1. encoder.set_color(png::ColorType::Rgba); encoder.set_depth(png::BitDepth::Eight); let mut writer = encoder.write_header().unwrap(); writer.write_image_data(png.as_slice()).unwrap(); let end = start.elapsed(); println!("{}.{:03} second elapsed.", end.as_secs(), end.subsec_nanos() / 1_000_000); Ok(()) } ``` Output You can also draw other shapes like this ![optical](optical.png)