Expand description
The xbm
crate is a XBM encoding and decoding library.
This crate supports the X version 11 bitmap file format.
The width and the height of XBM are unlimited, but in this crate they are
limited to u32
.
§Examples
§Encoding a XBM file
use std::io::Write;
use xbm::Encoder;
// "B" (8x7)
let pixels = b"\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x01\x00\x00\x01\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x01\x00\x00\x01\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00";
let mut buf = [u8::default(); 132];
let encoder = Encoder::new(buf.as_mut_slice());
encoder.encode(pixels, "image", 8, 7, None, None).unwrap();
assert_eq!(buf, *include_bytes!("../tests/data/basic.xbm"));
§image
crate support
use std::io::Write;
use xbm::Encoder;
let input = image::open("tests/data/qr_code.png").unwrap();
let mut buf = Vec::with_capacity(69454);
let encoder = Encoder::new(buf.by_ref());
input.write_with_encoder(encoder).unwrap();
assert_eq!(buf, include_bytes!("../tests/data/qr_code.xbm"));
§Decoding a XBM file
use std::{fs::File, io::BufReader};
use xbm::Decoder;
// "B" (8x7)
let expected = b"\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x01\x00\x00\x01\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x01\x00\x00\x01\x00\x00\
\x00\x00\x01\x01\x01\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00";
let reader = File::open("tests/data/basic.xbm")
.map(BufReader::new)
.unwrap();
let decoder = Decoder::new(reader).unwrap();
assert_eq!(decoder.width(), 8);
assert_eq!(decoder.height(), 7);
let mut buf = [u8::default(); 56];
decoder.decode(&mut buf).unwrap();
assert_eq!(buf, *expected);
§image
crate support
use std::{
fs::File,
io::{BufReader, Cursor},
};
use xbm::{
Decoder,
image::{DynamicImage, ImageDecoder, ImageFormat},
};
let reader = File::open("tests/data/qr_code.xbm")
.map(BufReader::new)
.unwrap();
let decoder = Decoder::new(reader).unwrap();
assert_eq!(decoder.dimensions(), (296, 296));
let image = DynamicImage::from_decoder(decoder).unwrap();
let mut writer = Cursor::new(Vec::with_capacity(2091));
image.write_to(&mut writer, ImageFormat::Png).unwrap();
let actual = image::load_from_memory(writer.get_ref()).unwrap();
let expected = image::open("tests/data/qr_code.png").unwrap();
assert_eq!(actual, expected);