use image::RgbImage;
use crate::error::{Result, StegoError};
pub fn image_capacity(img: &RgbImage, bpc: u8) -> Result<usize> {
if bpc == 0 || bpc > 8 {
return Err(StegoError::InvalidBitsPerChannel(bpc));
}
let pixels = img.width() as usize * img.height() as usize;
Ok(pixels * 3 * bpc as usize / 8)
}
#[cfg(test)]
mod tests {
use super::*;
use image::RgbImage;
fn blank(w: u32, h: u32) -> RgbImage {
RgbImage::new(w, h)
}
#[test]
fn capacity_100x100_bpc1() {
assert_eq!(image_capacity(&blank(100, 100), 1).unwrap(), 3750);
}
#[test]
fn capacity_bpc0_invalid() {
let err = image_capacity(&blank(100, 100), 0).unwrap_err();
assert!(matches!(err, StegoError::InvalidBitsPerChannel(0)));
}
#[test]
fn capacity_bpc9_invalid() {
let err = image_capacity(&blank(100, 100), 9).unwrap_err();
assert!(matches!(err, StegoError::InvalidBitsPerChannel(9)));
}
}