mod img_nearest;
mod mat;
mod raw_img;
mod rect;
mod sixel;
mod texel;
use minlin::{Cast, MapExt, RectExt};
use crate::Rgb;
pub use self::{
img_nearest::*, mat::*, raw_img::*, rect::*, sixel::*, texel::*,
};
pub trait Image {
fn width(&self) -> usize;
fn height(&self) -> usize;
fn get_pixel(&self, x: usize, y: usize) -> Rgb;
fn get_avg(&self, rect: Rect) -> Rgb<f32> {
let mut color_sum: Rgb<usize> = Rgb::default();
let x = rect.x as usize;
let y = rect.y as usize;
let w = (rect.width() as usize).max(1);
let h = (rect.height() as usize).max(1);
for y in y..y + h {
for x in x..x + w {
color_sum += self.get_pixel(x, y).map(|a| a as usize);
}
}
let sumf: Rgb<f32> = color_sum.cast();
sumf / (w * h) as f32
}
}
#[cfg(feature = "image")]
impl<T: image::GenericImage> Image for T
where
T::Pixel: image::Pixel<Subpixel = u8>,
{
fn width(&self) -> usize {
self.width() as usize
}
fn height(&self) -> usize {
self.height() as usize
}
fn get_pixel(&self, x: usize, y: usize) -> Rgb {
use image::Pixel;
<Self as image::GenericImageView>::get_pixel(self, x as u32, y as u32)
.to_rgb()
.0
.into()
}
}