diff --git a/Cargo.toml b/Cargo.toml index 84c9310..af8a46a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,3 +50,4 @@ serde_json = { version = "1.0.140", optional = true } time = "0.3.41" toml = { version = "0.9.2", optional = true } zerocopy = { version = "0.8.26", features = ["derive"] } +image = "0.25.6" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 116a66c..4a11220 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,11 +4,6 @@ use std::{fs, path::PathBuf}; use anyhow::{Context, Result}; -use badgemagic::{ - ble::Device as BleDevice, - protocol::{Mode, PayloadBuffer, Speed, Style}, - usb_hid::Device as UsbDevice, -}; use base64::Engine; use clap::{Parser, ValueEnum}; use embedded_graphics::{ @@ -20,6 +15,13 @@ use embedded_graphics::{ Drawable, Pixel, }; use serde::Deserialize; +use image::{imageops::FilterType, ImageReader}; + +use badgemagic::{ + ble::Device as BleDevice, + protocol::{Mode, PayloadBuffer, Speed, Style}, + usb_hid::Device as UsbDevice, +}; #[derive(Parser)] /// Upload a configuration with up to 8 messages to an LED badge @@ -92,8 +94,7 @@ enum Content { Bitstring { bitstring: String }, BitmapBase64 { width: u32, bitmap_base64: String }, BitmapFile { width: u32, bitmap_file: PathBuf }, - // TODO: implement png - // PngFile { png_file: PathBuf }, + ImageFile { img_file: PathBuf }, } fn main() -> Result<()> { @@ -224,6 +225,23 @@ fn gnerate_payload(args: &mut Args) -> Result { let image = Image::new(&image_raw, Point::zero()); payload.add_message_drawable(style, &image); } + Content::ImageFile { img_file } => { + let img_reader = ImageReader::open(img_file)?; + let img = img_reader + .decode()? + .resize(u32::MAX, 11, FilterType::Nearest) + .into_luma8(); + let (width, height) = img.dimensions(); + let mut buffer = payload.add_message(style, (width as usize + 7) / 8); + for y in 0..height { + for x in 0..width { + if img.get_pixel(x, y).0 > [31] { + Pixel(Point::new(x.try_into()?, y.try_into()?), BinaryColor::On) + .draw(&mut buffer)?; + } + } + } + } } }