mirror of
https://github.com/fossasia/badgemagic-rs
synced 2025-07-29 14:43:58 +00:00
feat: add (non-animated) image support
This commit is contained in:
parent
5d745ab8fd
commit
a10617fe6d
2 changed files with 26 additions and 7 deletions
|
@ -50,3 +50,4 @@ serde_json = { version = "1.0.140", optional = true }
|
||||||
time = "0.3.41"
|
time = "0.3.41"
|
||||||
toml = { version = "0.9.2", optional = true }
|
toml = { version = "0.9.2", optional = true }
|
||||||
zerocopy = { version = "0.8.26", features = ["derive"] }
|
zerocopy = { version = "0.8.26", features = ["derive"] }
|
||||||
|
image = "0.25.6"
|
32
src/main.rs
32
src/main.rs
|
@ -4,11 +4,6 @@
|
||||||
use std::{fs, path::PathBuf};
|
use std::{fs, path::PathBuf};
|
||||||
|
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use badgemagic::{
|
|
||||||
ble::Device as BleDevice,
|
|
||||||
protocol::{Mode, PayloadBuffer, Speed, Style},
|
|
||||||
usb_hid::Device as UsbDevice,
|
|
||||||
};
|
|
||||||
use base64::Engine;
|
use base64::Engine;
|
||||||
use clap::{Parser, ValueEnum};
|
use clap::{Parser, ValueEnum};
|
||||||
use embedded_graphics::{
|
use embedded_graphics::{
|
||||||
|
@ -20,6 +15,13 @@ use embedded_graphics::{
|
||||||
Drawable, Pixel,
|
Drawable, Pixel,
|
||||||
};
|
};
|
||||||
use serde::Deserialize;
|
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)]
|
#[derive(Parser)]
|
||||||
/// Upload a configuration with up to 8 messages to an LED badge
|
/// Upload a configuration with up to 8 messages to an LED badge
|
||||||
|
@ -92,8 +94,7 @@ enum Content {
|
||||||
Bitstring { bitstring: String },
|
Bitstring { bitstring: String },
|
||||||
BitmapBase64 { width: u32, bitmap_base64: String },
|
BitmapBase64 { width: u32, bitmap_base64: String },
|
||||||
BitmapFile { width: u32, bitmap_file: PathBuf },
|
BitmapFile { width: u32, bitmap_file: PathBuf },
|
||||||
// TODO: implement png
|
ImageFile { img_file: PathBuf },
|
||||||
// PngFile { png_file: PathBuf },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
|
@ -224,6 +225,23 @@ fn gnerate_payload(args: &mut Args) -> Result<PayloadBuffer> {
|
||||||
let image = Image::new(&image_raw, Point::zero());
|
let image = Image::new(&image_raw, Point::zero());
|
||||||
payload.add_message_drawable(style, &image);
|
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)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue