From 51a247c524420443bd2488ad01c993385d9aaade Mon Sep 17 00:00:00 2001 From: reshane Date: Tue, 4 Feb 2025 20:28:43 -0500 Subject: [PATCH 1/2] Wbmp encoding / decoding --- Cargo.toml | 8 +- README.md | 1 + src/lib.rs | 7 ++ src/wbmp.rs | 150 +++++++++++++++++++++++++++++++++++ tests/images/wbmp/field.png | Bin 0 -> 41954 bytes tests/images/wbmp/field.wbmp | Bin 0 -> 34086 bytes 6 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/wbmp.rs create mode 100644 tests/images/wbmp/field.png create mode 100644 tests/images/wbmp/field.wbmp diff --git a/Cargo.toml b/Cargo.toml index 378cc50..16250dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,20 @@ publish = false include = ["src", "tests/reference.rs"] [features] -default = ["pcx"] +default = ["pcx", "wbmp", "otb"] pcx = ["dep:pcx"] +wbmp = ["dep:wbmp"] +otb = [] [dependencies] image = { version = "0.25.5", default-features = false } pcx = { version = "0.2.4", optional = true } +wbmp = { version = "0.1.2", optional = true } [dev-dependencies] image = { version = "0.25.5", default-features = false, features = ["png"] } walkdir = "2.5.0" [patch.crates-io] -image = { git = "https://github.com/fintelia/image", branch = "decoding-hooks" } +#image = { git = "https://github.com/fintelia/image", branch = "decoding-hooks" } +image = { git = "https://github.com/reshane/image", branch = "decoding-hooks" } diff --git a/README.md b/README.md index ffd6f56..6bcdaa3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Decoding support for additional image formats beyond those provided by the [`ima | Extension | File Format Description | | --------- | -------------------- | | PCX | [Wikipedia](https://en.wikipedia.org/wiki/PCX#PCX_file_format) | +| WBMP | [Wikipedia](https://en.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format) | ## New Formats diff --git a/src/lib.rs b/src/lib.rs index 10560f6..0864453 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,10 +18,17 @@ #[cfg(feature = "pcx")] pub mod pcx; +#[cfg(feature = "wbmp")] +pub mod wbmp; + /// Register all enabled extra formats with the image crate. pub fn register() { image::hooks::register_decoding_hook( image::ImageFormat::Pcx, Box::new(|r| Ok(Box::new(pcx::PCXDecoder::new(r)?))), ); + image::hooks::register_decoding_hook( + image::ImageFormat::Wbmp, + Box::new(|r| Ok(Box::new(wbmp::WbmpDecoder::new(r)?))), + ); } diff --git a/src/wbmp.rs b/src/wbmp.rs new file mode 100644 index 0000000..80ae6b4 --- /dev/null +++ b/src/wbmp.rs @@ -0,0 +1,150 @@ +//! WBMP (Wireless BitMaP) Format is an image format used by the WAP protocol. +//! +//! # Related Links +//! * - The WBMP format on Wikipedia +//! * - The WAP Specification + +use std::io::{BufRead, Seek, Write}; + +use image::error::{ + DecodingError, EncodingError, ImageFormatHint, UnsupportedError, UnsupportedErrorKind, +}; +use image::{ColorType, ExtendedColorType, ImageDecoder, ImageEncoder, ImageError, ImageResult}; + +use wbmp::error::WbmpError; + +/// Encoder for Wbmp images. +pub struct WbmpEncoder<'a, W> { + writer: Option, + inner: Option>, + threshold: u8, +} + +impl<'a, W: Write> WbmpEncoder<'a, W> { + pub fn new(writer: W) -> Result, ImageError> { + let threshold = 127_u8; + + Ok(WbmpEncoder { + writer: Some(writer), + inner: None, + threshold, + }) + } + + pub fn with_threshold(mut self, threshold: u8) -> WbmpEncoder<'a, W> { + self.threshold = threshold; + self + } +} + +impl<'a, W: Write> ImageEncoder for WbmpEncoder<'a, W> { + fn write_image( + mut self, + buf: &[u8], + width: u32, + height: u32, + color_type: ExtendedColorType, + ) -> std::result::Result<(), ImageError> { + let color = match color_type { + ExtendedColorType::L8 => wbmp::ColorType::Luma8, + ExtendedColorType::Rgba8 => wbmp::ColorType::Rgba8, + _ => { + return Err(ImageError::Encoding(EncodingError::from_format_hint( + ImageFormatHint::Name("Unsupported ColorType".to_string()), + ))); + } + }; + + if let Some(mut inner) = self.inner { + inner.encode(buf, width, height, color) + } else { + let mut writer = self.writer.take().unwrap(); + let mut encoder = wbmp::Encoder::new(&mut writer); + encoder.encode(buf, width, height, color) + } + .map_err(|err| match err { + WbmpError::IoError(io) => ImageError::IoError(io), + _ => todo!(), + })?; + Ok(()) + } +} + +/// Decoder for Wbmp images. +pub struct WbmpDecoder +where + R: BufRead + Seek, +{ + dimensions: (u32, u32), + inner: wbmp::Decoder, +} + +impl WbmpDecoder +where + R: BufRead + Seek, +{ + /// Create a new `WbmpDecoder`. + pub fn new(r: R) -> Result, ImageError> { + let inner = wbmp::Decoder::new(r).map_err(convert_wbmp_decode_error)?; + let dimensions = inner.dimensions(); + + Ok(WbmpDecoder { dimensions, inner }) + } +} + +fn convert_wbmp_decode_error(err: wbmp::error::WbmpError) -> ImageError { + use wbmp::error::WbmpError; + match err { + WbmpError::IoError(inner) => ImageError::IoError(inner), + WbmpError::UnsupportedType(inner) => { + ImageError::Unsupported(UnsupportedError::from_format_and_kind( + ImageFormatHint::Name("WBMP".to_string()), + UnsupportedErrorKind::GenericFeature(format!( + "type {} is not supported for wbmp images", + inner + )), + )) + } + WbmpError::UnsupportedHeaders => { + ImageError::Unsupported(UnsupportedError::from_format_and_kind( + ImageFormatHint::Name("WBMP".to_string()), + UnsupportedErrorKind::GenericFeature( + "Extension headers are not supported for wbmp images".to_string(), + ), + )) + } + WbmpError::InvalidImageData => ImageError::Decoding(DecodingError::from_format_hint( + ImageFormatHint::Name("WBMP".to_string()), + )), + WbmpError::UsageError(inner) => ImageError::Decoding(DecodingError::new( + ImageFormatHint::Name("WBMP".to_string()), + Box::new(WbmpError::UsageError(inner)), + )), + } +} + +impl ImageDecoder for WbmpDecoder { + fn dimensions(&self) -> (u32, u32) { + self.dimensions + } + + fn color_type(&self) -> ColorType { + ColorType::L8 + } + + fn original_color_type(&self) -> ExtendedColorType { + ExtendedColorType::L1 + } + + fn read_image(mut self, buf: &mut [u8]) -> ImageResult<()> { + self.inner + .read_image_data(buf) + .map_err(convert_wbmp_decode_error)?; + Ok(()) + } + + fn read_image_boxed(self: Box, buf: &mut [u8]) -> ImageResult<()> { + (*self).read_image(buf)?; + Ok(()) + } +} diff --git a/tests/images/wbmp/field.png b/tests/images/wbmp/field.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f6dfdec60e179c193ad63e2e2af0e635cc9d8f GIT binary patch literal 41954 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
MpjE~Z!ScA)5_C=wE+1z+cb`!Cbw2$+Eu_rR*< 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 literal 0 HcmV?d00001 From fec77c6ee5bd1aa975b6207fd76896644d80f40e Mon Sep 17 00:00:00 2001 From: reshane Date: Wed, 5 Feb 2025 12:10:45 -0500 Subject: [PATCH 2/2] Otb encoding / decoding --- README.md | 1 + src/lib.rs | 9 + src/otb.rs | 502 +++++++++++++++++++++++++++++ src/wbmp.rs | 15 +- tests/images/otb/shane_face.otb | Bin 0 -> 1304 bytes tests/images/otb/shane_face.png | Bin 0 -> 748 bytes tests/images/otb/shane_house.otb | Bin 0 -> 1304 bytes tests/images/otb/shane_house.png | Bin 0 -> 1190 bytes tests/images/wbmp/field.png | Bin 41954 -> 0 bytes tests/images/wbmp/field.wbmp | Bin 34086 -> 0 bytes tests/images/wbmp/shane_face.png | Bin 0 -> 748 bytes tests/images/wbmp/shane_face.wbmp | Bin 0 -> 1304 bytes tests/images/wbmp/shane_house.png | Bin 0 -> 1190 bytes tests/images/wbmp/shane_house.wbmp | Bin 0 -> 1304 bytes 14 files changed, 518 insertions(+), 9 deletions(-) create mode 100644 src/otb.rs create mode 100644 tests/images/otb/shane_face.otb create mode 100644 tests/images/otb/shane_face.png create mode 100644 tests/images/otb/shane_house.otb create mode 100644 tests/images/otb/shane_house.png delete mode 100644 tests/images/wbmp/field.png delete mode 100644 tests/images/wbmp/field.wbmp create mode 100644 tests/images/wbmp/shane_face.png create mode 100644 tests/images/wbmp/shane_face.wbmp create mode 100644 tests/images/wbmp/shane_house.png create mode 100644 tests/images/wbmp/shane_house.wbmp diff --git a/README.md b/README.md index 6bcdaa3..7f23723 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Decoding support for additional image formats beyond those provided by the [`ima | --------- | -------------------- | | PCX | [Wikipedia](https://en.wikipedia.org/wiki/PCX#PCX_file_format) | | WBMP | [Wikipedia](https://en.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format) | +| OTB | [Wikipedia](https://en.wikipedia.org/wiki/OTA_bitmap) | ## New Formats diff --git a/src/lib.rs b/src/lib.rs index 0864453..6360399 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,14 +21,23 @@ pub mod pcx; #[cfg(feature = "wbmp")] pub mod wbmp; +#[cfg(feature = "otb")] +pub mod otb; + /// Register all enabled extra formats with the image crate. pub fn register() { image::hooks::register_decoding_hook( image::ImageFormat::Pcx, Box::new(|r| Ok(Box::new(pcx::PCXDecoder::new(r)?))), ); + #[cfg(feature = "wbmp")] image::hooks::register_decoding_hook( image::ImageFormat::Wbmp, Box::new(|r| Ok(Box::new(wbmp::WbmpDecoder::new(r)?))), ); + #[cfg(feature = "otb")] + image::hooks::register_decoding_hook( + image::ImageFormat::Otb, + Box::new(|r| Ok(Box::new(otb::OtbDecoder::new(r)?))), + ); } diff --git a/src/otb.rs b/src/otb.rs new file mode 100644 index 0000000..2bc430e --- /dev/null +++ b/src/otb.rs @@ -0,0 +1,502 @@ +//! Decoding of OTB Images +//! +//! OTB (Over The air Bitmap) Format is an image format from Nokia's Smart Messaging specification. +//! +//! # Related Links +//! * - The WBMP format on Wikipedia +//! * - The WAP Specification + +use std::error; +use std::fmt::{self, Display}; +use std::io::{BufRead, Seek, Write}; + +use image::error::{DecodingError, EncodingError, LimitError, LimitErrorKind}; +use image::{ + ColorType, ExtendedColorType, ImageDecoder, ImageEncoder, ImageError, ImageFormat, ImageResult, +}; + +/// All errors that can occur when attempting to encode an image to OTB format +#[derive(Debug, Clone)] +enum EncoderError { + /// Specified image does not fit into OTB width / height constraints + ImageTooLarge, + + /// ColorType of image is not supported + UnsupportedColorType, +} + +impl Display for EncoderError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + EncoderError::ImageTooLarge => f.write_fmt(format_args!( + "Specified image is too large for the OTB format (Max 255x255)" + )), + EncoderError::UnsupportedColorType => f.write_fmt(format_args!( + "Color type of specified image is not supported" + )), + } + } +} + +impl From for ImageError { + fn from(e: EncoderError) -> ImageError { + match e { + EncoderError::ImageTooLarge => { + ImageError::Limits(LimitError::from_kind(LimitErrorKind::DimensionError)) + } + _ => ImageError::Encoding(EncodingError::new(ImageFormat::Otb.into(), e)), + } + } +} + +impl error::Error for EncoderError { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + None + } +} + +/// Encoder for Otb images. +pub struct OtbEncoder<'a, W> { + writer: &'a mut W, + threshold: u8, +} + +impl<'a, W: Write> OtbEncoder<'a, W> { + pub fn new(writer: &'a mut W) -> Result, ImageError> { + Ok(OtbEncoder { + writer, + threshold: 127_u8, + }) + } + + pub fn with_threshold(mut self, threshold: u8) -> OtbEncoder<'a, W> { + self.threshold = threshold; + self + } +} + +impl<'a, W: Write> ImageEncoder for OtbEncoder<'a, W> { + fn write_image( + self, + buf: &[u8], + width: u32, + height: u32, + color_type: ExtendedColorType, + ) -> std::result::Result<(), ImageError> { + if width > 0xFF || height > 0xFF { + return Err(EncoderError::ImageTooLarge.into()); + } + if color_type != ExtendedColorType::L8 { + return Err(EncoderError::UnsupportedColorType.into()); + } + + // Write Headers + let _ = self + .writer + .write(&[0x00, width as u8, height as u8, 0x01])?; + + // Write the encoded image + let mut buf_idx = 0; + let mut current_byte = 0_u8; + let mut bit = 0; + for _y in 0..height { + for _x in 0..width { + if buf[buf_idx] < self.threshold { + current_byte |= 1 << (7 - bit); + } + bit += 1; + buf_idx += 1; + if bit == 8 { + match self.writer.write_all(&[current_byte]) { + Ok(_) => {} + Err(err) => { + return Err(err.into()); + } + } + current_byte = 0_u8; + bit = 0; + }; + } + if bit != 0 { + let _ = self.writer.write_all(&[current_byte])?; + bit = 0; + current_byte = 0; + } + } + + Ok(()) + } +} + +/// All errors that can occur when attempting to parse an OTB image +#[derive(Debug, Clone)] +enum DecoderError { + /// OTB image headers are malformed or invalid + InvalidHeader(InvalidHeaderKind), + + /// Output buffer could not accommodate the image data + InsufficientOutputBuffer, +} + +#[derive(Debug, Clone)] +enum InvalidHeaderKind { + /// Info field in OTB image headers is unsupported + UnsupportedInfoField(u8), + + /// Width in OTB image headers is zero + WidthZero, + + /// Height in OTB image headers is zero + HeightZero, + + /// Specified color depth is not supported + UnsupportedDepth(u8), +} + +impl Display for DecoderError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + DecoderError::InvalidHeader(kind) => match kind { + InvalidHeaderKind::UnsupportedInfoField(info) => { + f.write_fmt(format_args!("Unsupported value in info field {:08b}", info)) + } + InvalidHeaderKind::WidthZero => f.write_fmt(format_args!("Width cannot be zero")), + InvalidHeaderKind::HeightZero => f.write_fmt(format_args!("Height cannot be zero")), + InvalidHeaderKind::UnsupportedDepth(depth) => f.write_fmt(format_args!( + "Unsupported color depth value in headers {}", + depth + )), + }, + DecoderError::InsufficientOutputBuffer => f.write_fmt(format_args!( + "Specified output buffer is insuffient for decoded image data" + )), + } + } +} + +impl From for ImageError { + fn from(e: DecoderError) -> ImageError { + ImageError::Decoding(DecodingError::new(ImageFormat::Otb.into(), e)) + } +} + +impl error::Error for DecoderError { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + None + } +} + +/// Decoder for Otb images. +pub struct OtbDecoder +where + R: BufRead + Seek, +{ + reader: R, + dimensions: (u32, u32), +} + +impl OtbDecoder +where + R: BufRead + Seek, +{ + /// Create a new `OtbDecoder`. + pub fn new(reader: R) -> Result, ImageError> { + let mut decoder = Self::new_decoder(reader); + decoder.read_metadata()?; + Ok(decoder) + } + + fn new_decoder(reader: R) -> OtbDecoder { + Self { + reader, + dimensions: (0, 0), + } + } + + fn read_metadata(&mut self) -> Result<(), ImageError> { + // InfoField - 00 for single byte width/height values + let info_field_buf: &mut [u8; 1] = &mut [0; 1]; + self.reader.read_exact(info_field_buf)?; + let info_field = info_field_buf[0]; + if info_field != 0 { + return Err( + DecoderError::InvalidHeader(InvalidHeaderKind::UnsupportedInfoField(info_field)) + .into(), + ); + } + + // Width + let width_buf: &mut [u8; 1] = &mut [0; 1]; + self.reader.read_exact(width_buf)?; + let width = width_buf[0]; + if width == 0 { + return Err(DecoderError::InvalidHeader(InvalidHeaderKind::WidthZero).into()); + } + + // Height + let height_buf: &mut [u8; 1] = &mut [0; 1]; + self.reader.read_exact(height_buf)?; + let height = height_buf[0]; + if height == 0 { + return Err(DecoderError::InvalidHeader(InvalidHeaderKind::HeightZero).into()); + } + + // Depth + let depth_buf: &mut [u8; 1] = &mut [0; 1]; + self.reader.read_exact(depth_buf)?; + let depth = depth_buf[0]; + if depth != 1 { + return Err( + DecoderError::InvalidHeader(InvalidHeaderKind::UnsupportedDepth(depth)).into(), + ); + } + + self.dimensions = (width as u32, height as u32); + + Ok(()) + } +} + +impl ImageDecoder for OtbDecoder { + fn dimensions(&self) -> (u32, u32) { + self.dimensions + } + + fn color_type(&self) -> ColorType { + ColorType::L8 + } + + fn original_color_type(&self) -> ExtendedColorType { + ExtendedColorType::L1 + } + + fn read_image(mut self, buf: &mut [u8]) -> ImageResult<()> { + if (buf.len() as u32) < (self.dimensions.0 * self.dimensions.1) { + return Err(DecoderError::InsufficientOutputBuffer.into()); + } + + // Read entire image data into a buffer + let mut byte_buf = Vec::::with_capacity((buf.len() / 8) + 1); + let _ = self.reader.read_to_end(&mut byte_buf)?; + + // Set a byte in buf for every bit in the image data + let mut buf_idx = 0; + let mut bytes_idx = 0; + let (width, height) = (self.dimensions.0 as usize, self.dimensions.1 as usize); + let mut bit = 0; + let mut byte = 0; + for _y in 0..height { + for _x in 0..width { + if bit == 0 { + byte = byte_buf[bytes_idx]; + bytes_idx += 1; + } + buf[buf_idx] = if (byte >> (7 - bit)) & 1 == 0 { + 0xFF + } else { + 0x00 + }; + + buf_idx += 1; + bit += 1; + + if bit == 8 { + bit = 0; + } + } + bit = 0; + } + Ok(()) + } + + fn read_image_boxed(self: Box, buf: &mut [u8]) -> ImageResult<()> { + (*self).read_image(buf)?; + Ok(()) + } +} + +mod test { + #[test] + fn test_decode_image() { + use image::ImageDecoder; + use std::io::Cursor; + let otb_data = vec![ + // Headers + 0x00, 0x48, 0x1C, 0x01, // End Headers + // Image Data + 0x7F, 0xFF, 0xEF, 0xFF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFE, 0x40, 0x3F, 0xE8, 0x38, 0x2F, + 0xFF, 0xFB, 0xFF, 0xFE, 0x48, 0x3F, 0xA8, 0x38, 0x2F, 0x9F, 0xFB, 0xFF, 0xFE, 0x4C, + 0xFF, 0xA9, 0xFF, 0x2F, 0x8F, 0xFA, 0xDA, 0xDA, 0x4E, 0xFF, 0x29, 0x01, 0x2F, 0x80, + 0xFA, 0x52, 0x52, 0x5E, 0x7F, 0x69, 0x31, 0x2F, 0xBF, 0x7B, 0x07, 0x06, 0x4F, 0xFF, + 0x69, 0x79, 0x2F, 0xBE, 0xFB, 0x77, 0x76, 0x47, 0xFF, 0x69, 0x79, 0x2F, 0xBE, 0x7B, + 0x07, 0x06, 0x47, 0xFE, 0xEF, 0x7D, 0xEF, 0xBE, 0x7B, 0xFF, 0xFE, 0x47, 0xFC, 0xEF, + 0x7D, 0xE7, 0xBC, 0xF1, 0xFF, 0xFC, 0x40, 0xF0, 0xEF, 0x7D, 0xE7, 0x7C, 0xF1, 0xED, + 0xBC, 0x21, 0xE7, 0xC9, 0x79, 0x27, 0x98, 0xF1, 0xE5, 0x3C, 0x21, 0xE7, 0xC9, 0x39, + 0x27, 0xC8, 0xF1, 0xF0, 0x7C, 0x16, 0x6F, 0x89, 0x39, 0x23, 0xE6, 0xE0, 0xF7, 0x78, + 0x15, 0x2F, 0x88, 0x82, 0x23, 0xF3, 0xE0, 0xF0, 0x78, 0x08, 0x3F, 0x04, 0x44, 0x43, + 0xD7, 0xE0, 0xFF, 0xF8, 0x04, 0x3E, 0x02, 0x28, 0x81, 0xEF, 0xC0, 0x7F, 0xF0, 0x02, + 0x3C, 0x01, 0x39, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0x01, 0x38, 0x00, 0xBA, 0x00, 0x7F, + 0x00, 0x1F, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0xFF, 0xC0, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x07, 0xFF, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xAA, 0x2A, 0xF3, 0x87, 0x87, 0x3F, 0x1E, 0x67, 0x0F, 0x54, 0x15, 0xF3, 0x93, + 0x9F, 0x3E, 0x4E, 0x27, 0x27, 0xA8, 0x2A, 0xF3, 0x87, 0x8F, 0x3E, 0x4E, 0x07, 0x27, + 0x54, 0x55, 0xF3, 0x93, 0x9F, 0x3E, 0x0E, 0x47, 0x27, 0xAA, 0xFF, 0xF3, 0x9B, 0x87, + 0x0E, 0x4E, 0x67, 0x0F, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, // End Image Data + ]; + let decoder = crate::otb::OtbDecoder::new(Cursor::new(otb_data)).unwrap(); + let (width, height) = decoder.dimensions(); + assert!(width == 0x48); + assert!(height == 0x1C); + let mut img_bytes = vec![0; 2016]; + decoder.read_image(&mut img_bytes).unwrap(); + } + + #[test] + fn test_decoder_irregular_width() { + use image::ImageDecoder; + use std::io::Cursor; + let expected_data = [ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // row0 + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, // row1 + 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, // row2 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row3 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row4 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row5 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row6 + 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, // row7 + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, // row8 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // row9 + ]; + let image_data: [u8; 24] = [ + 0, 10, 10, 1, // headers + 0b00000000, 0b00000000, // row0 + 0b00001100, 0b00000000, // row1 + 0b00010010, 0b00000000, // row2 + 0b00100001, 0b00000000, // row3 + 0b01000000, 0b10000000, // row4 + 0b01000000, 0b10000000, // row5 + 0b00100001, 0b00000000, // row6 + 0b00010010, 0b00000000, // row7 + 0b00001100, 0b00000000, // row8 + 0b00000000, 0b00000000, // row9 + ]; + let decoder = crate::otb::OtbDecoder::new(Cursor::new(image_data)).unwrap(); + let (width, height) = decoder.dimensions(); + assert!(width == 10); + assert!(height == 10); + let mut img_bytes = vec![0; 100]; + decoder.read_image(&mut img_bytes).unwrap(); + img_bytes.iter().enumerate().for_each(|(i, byte)| { + assert_eq!(*byte, expected_data[i]); + }); + } + + #[test] + fn test_decoder() { + use image::ImageDecoder; + use std::io::Cursor; + let expected_data = [ + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // row1 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row2 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row3 + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // row4 + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // row5 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row6 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row7 + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // row8 + ]; + let image_data: [u8; 12] = [ + 0, 8, 8, 1, // headers + 0b00011000, // row1 + 0b00100100, // row2 + 0b01000010, // row3 + 0b10000001, // row4 + 0b10000001, // row5 + 0b01000010, // row6 + 0b00100100, // row7 + 0b00011000, // row8 + ]; + let decoder = crate::otb::OtbDecoder::new(Cursor::new(image_data)).unwrap(); + let (width, height) = decoder.dimensions(); + assert!(width == 8); + assert!(height == 8); + let mut img_bytes = vec![0; 64]; + decoder.read_image(&mut img_bytes).unwrap(); + img_bytes.iter().enumerate().for_each(|(i, byte)| { + assert_eq!(*byte, expected_data[i]); + }); + } + + #[test] + fn test_encoder() { + use image::ImageEncoder; + let img_data = [ + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // row1 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row2 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row3 + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // row4 + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // row5 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row6 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row7 + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // row8 + ]; + let expected_data: [u8; 12] = [ + 0, 8, 8, 1, // headers + 0b00011000, // row1 + 0b00100100, // row2 + 0b01000010, // row3 + 0b10000001, // row4 + 0b10000001, // row5 + 0b01000010, // row6 + 0b00100100, // row7 + 0b00011000, // row8 + ]; + let mut encoded_data = Vec::::with_capacity(expected_data.len()); + let encoder = crate::otb::OtbEncoder::new(&mut encoded_data).unwrap(); + let _ = encoder + .write_image(&img_data, 8, 8, image::ExtendedColorType::L8) + .unwrap(); + encoded_data.iter().enumerate().for_each(|(i, byte)| { + assert_eq!(*byte, expected_data[i]); + }); + } + + #[test] + fn test_encoder_irregular_width() { + use image::ImageEncoder; + let img_data = [ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // row0 + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, // row1 + 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, // row2 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row3 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row4 + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, // row5 + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, // row6 + 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, // row7 + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, // row8 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // row9 + ]; + let expected_data: [u8; 24] = [ + 0, 10, 10, 1, // headers + 0b00000000, 0b00000000, // row0 + 0b00001100, 0b00000000, // row1 + 0b00010010, 0b00000000, // row2 + 0b00100001, 0b00000000, // row3 + 0b01000000, 0b10000000, // row4 + 0b01000000, 0b10000000, // row5 + 0b00100001, 0b00000000, // row6 + 0b00010010, 0b00000000, // row7 + 0b00001100, 0b00000000, // row8 + 0b00000000, 0b00000000, // row9 + ]; + let mut encoded_data = Vec::::with_capacity(expected_data.len()); + let encoder = crate::otb::OtbEncoder::new(&mut encoded_data).unwrap(); + let _ = encoder + .write_image(&img_data, 10, 10, image::ExtendedColorType::L8) + .unwrap(); + encoded_data.iter().enumerate().for_each(|(i, byte)| { + assert_eq!(*byte, expected_data[i]); + }); + } +} diff --git a/src/wbmp.rs b/src/wbmp.rs index 80ae6b4..dfbdceb 100644 --- a/src/wbmp.rs +++ b/src/wbmp.rs @@ -1,3 +1,5 @@ +//! Encoding and Deciding of WBMP Images +//! //! WBMP (Wireless BitMaP) Format is an image format used by the WAP protocol. //! //! # Related Links @@ -11,8 +13,6 @@ use image::error::{ }; use image::{ColorType, ExtendedColorType, ImageDecoder, ImageEncoder, ImageError, ImageResult}; -use wbmp::error::WbmpError; - /// Encoder for Wbmp images. pub struct WbmpEncoder<'a, W> { writer: Option, @@ -62,10 +62,7 @@ impl<'a, W: Write> ImageEncoder for WbmpEncoder<'a, W> { let mut encoder = wbmp::Encoder::new(&mut writer); encoder.encode(buf, width, height, color) } - .map_err(|err| match err { - WbmpError::IoError(io) => ImageError::IoError(io), - _ => todo!(), - })?; + .map_err(convert_wbmp_error)?; Ok(()) } } @@ -85,14 +82,14 @@ where { /// Create a new `WbmpDecoder`. pub fn new(r: R) -> Result, ImageError> { - let inner = wbmp::Decoder::new(r).map_err(convert_wbmp_decode_error)?; + let inner = wbmp::Decoder::new(r).map_err(convert_wbmp_error)?; let dimensions = inner.dimensions(); Ok(WbmpDecoder { dimensions, inner }) } } -fn convert_wbmp_decode_error(err: wbmp::error::WbmpError) -> ImageError { +fn convert_wbmp_error(err: wbmp::error::WbmpError) -> ImageError { use wbmp::error::WbmpError; match err { WbmpError::IoError(inner) => ImageError::IoError(inner), @@ -139,7 +136,7 @@ impl ImageDecoder for WbmpDecoder { fn read_image(mut self, buf: &mut [u8]) -> ImageResult<()> { self.inner .read_image_data(buf) - .map_err(convert_wbmp_decode_error)?; + .map_err(convert_wbmp_error)?; Ok(()) } diff --git a/tests/images/otb/shane_face.otb b/tests/images/otb/shane_face.otb new file mode 100644 index 0000000000000000000000000000000000000000..a200a9bb5037dba488b0731a420ead3c96c8ed35 GIT binary patch literal 1304 zcmaKsKW^JF6vkzE@aQAxD7sAc9-v4#^cn?xgKimu0;Yowor?4VEnRrXRFH;)Dz0dK z{k})ab%3UCkoeR4!;g=onyafBE-YP)afa-GbgHi1x>=^NS$v)IL%_hWo^P7R=`XlT zShvNqSu*TC7KliVLtkNB;vM?Y3dB8--2@NJS=F3vN7&YCM~;!Jf?fbep?oQYNd>&d zhy|_<7|gJI5O|g$43_h0H0ZrNxpVSFCqVFm?>0sZf>7XK;0tgfdfano*b_!Pvi3MP zp(6q(-)E=3o!|$FU8x5H99!%W)q@w%;|)D*6`Xplu(t)GfjmBOVpU^-0)g{X2&RDZ zAS8;GHYz9}nbaom8kf4sfk@G_X8N<8{^eF48_+JP$$hz|{$gTRuZkRom z#&et(T!w84;qY95vhEq%aBsDZSU0V-5^TwgtXt2~1lAeR2|7sCban*ef)4>4cU0Fw z=k2^yJBfi`WtRuGz$Du%$9l#vC#ZTj1tD8H$}Q1EG)B`?Ct@AJgB*6}Hj7%$(Zdy# zd%DAp5N(=XF6K=i!2TyZ@yP!WsJQ{oq7+b{O20q{z5q~|+ onB#cN_lQ5)5Q9xqAjsp<#c%X%mlWmjIdyqvP2?iYw1l&zKTad9BLDyZ literal 0 HcmV?d00001 diff --git a/tests/images/otb/shane_face.png b/tests/images/otb/shane_face.png new file mode 100644 index 0000000000000000000000000000000000000000..646b931d1ed26310ced009a1f8e6b289de78557c GIT binary patch literal 748 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 Eg8wub_y7O^ literal 0 HcmV?d00001 diff --git a/tests/images/wbmp/field.png b/tests/images/wbmp/field.png deleted file mode 100644 index f7f6dfdec60e179c193ad63e2e2af0e635cc9d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41954 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
MpjE~Z!ScA)5_C=wE+1z+cb`!Cbw2$+Eu_rR*< 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 diff --git a/tests/images/wbmp/shane_face.png b/tests/images/wbmp/shane_face.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8bea511953c862a30ed2ced9c7f94f7108a7a7 GIT binary patch literal 748 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 Ef}B7aqyPW_ literal 0 HcmV?d00001 diff --git a/tests/images/wbmp/shane_house.wbmp b/tests/images/wbmp/shane_house.wbmp new file mode 100644 index 0000000000000000000000000000000000000000..30a3c41a4030e8a6b3d2e48aa178ab770f1ab306 GIT binary patch literal 1304 zcmZ9ML5Lhh6o&um>h0=HI@7i0Fs%+rPsAN>wplbIEZL4OA?_hr&`U(H5<@OthJd)D zI5oSAC7x4c_y8p~1g@;$hGnw||V_rlkVh&=3LVkoY^dlS)RImXdgtsgO1c!`oV4;8t zFtwV8M7UY<%wHag@69o&wh@-_+$Z{$ZKMtrVGpS_hCYhGO3QJ|3)(~w7OAk5p-mE= zT5Q^=gIZbWs0*AcqZkLADQb3zqaM-|*35|B?mnkt)K8*3zZJ;aZsIcP?*ZG#gWyqc z*ZKzJj#>@tF0IhIf}ovsFXwZgFJk%>l8Yu^GWnAQPR^sf*>`icd~pNO5e$24IN|II zH=w?jD=V_<&Dw4s(S}Mcg?9&X_t!r5U%&Teny5&sAFkt|F-zHC;^zR%H!*X~epa;O zEEIAPtv83&;B?kXq}YHui)?MPpAYw75PbvH8+4scnBIv6h^?CI=bGuATuAVU=&cR= zNU-mhx=mMJ7S`}m>bLbS_S7F>hU~-N>DQo=R03&r|0TT)48lF2lRy9AETI<1P&PmF zev2S>3oIeO=g%eqVU=3sho8=WCn(zo^0|fPA;KYLc|XURGXY^@K%u9vHGD}#{=)Tx zPpEA|AU6o}UxN3Jp#BEo%q^;f#uX30jUoGyQ2%%gQ#;=E2Vh3@8p~db82JM20j(Cb!8<0-N zad?mr7~ixSo3M25#JAkn&qk&H*r6G7-@pqP&AG`4iDiN54%-P$t9-K^aLb^51zTfg zik&z|SO7eK;z}M9rx~vANJH