use std::ops::Deref;
use image::Primitive;
pub struct Image {
inner: image::DynamicImage
}
impl Deref for Image {
type Target = image::DynamicImage;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[derive(Debug, Clone)]
pub enum ImagePosition {
TopLeft,
TopRight,
BottomLeft,
BottomRight,
Center,
At(u32, u32)
}
#[derive(Debug)]
pub struct Rgb<T>(T, T, T);
impl<T: Primitive> From<image::Rgb<T>> for Rgb<T> {
fn from(color: image::Rgb<T>) -> Self {
let c = color.0;
Rgb(c[0], c[1], c[2])
}
}
impl<T: Primitive> From<[T; 3]> for Rgb<T> {
fn from(color: [T; 3]) -> Self {
Rgb(color[0], color[1], color[2])
}
}
impl<T: Primitive> Into<image::Rgb<T>> for Rgb<T> {
fn into(self) -> image::Rgb<T> {
image::Rgb([self.0, self.1, self.2])
}
}
#[derive(Debug, Clone)]
pub enum RgbChannel {
Red,
Green,
Blue
}
impl AsRef<RgbChannel> for RgbChannel {
fn as_ref(&self) -> &RgbChannel {
&self
}
}
impl From<&str> for RgbChannel {
fn from(repr: &str) -> Self {
match repr {
"red" | "r" => RgbChannel::Red,
"green" | "g" => RgbChannel::Green,
"blue" | "b" => RgbChannel::Blue,
_ => RgbChannel::Blue
}
}
}
impl Into<u8> for RgbChannel {
fn into(self) -> u8 {
match self {
RgbChannel::Red => { 0 }
RgbChannel::Green => { 1 }
RgbChannel::Blue => { 2 }
}
}
}
impl Into<usize> for RgbChannel {
fn into(self) -> usize {
match self {
RgbChannel::Red => { 0 }
RgbChannel::Green => { 1 }
RgbChannel::Blue => { 2 }
}
}
}
impl Into<usize> for &RgbChannel {
fn into(self) -> usize {
match self {
RgbChannel::Red => { 0 }
RgbChannel::Green => { 1 }
RgbChannel::Blue => { 2 }
}
}
}
pub trait ImageRules {
fn set_use_n_lsb(&mut self, n: usize) -> &mut Self;
fn set_offset(&mut self, offset: usize) -> &mut Self;
fn set_step_by_n_pixels(&mut self, n: usize) -> &mut Self;
fn set_use_channel(&mut self, channel: RgbChannel) -> &mut Self;
fn set_spread(&mut self, value: bool) -> &mut Self;
fn set_position(&mut self, value: ImagePosition) -> &mut Self;
fn get_use_n_lsb(&self) -> usize;
fn get_offset(&self) -> usize;
fn get_step_by_n_pixels(&self) -> usize;
fn get_use_channel(&self) -> &RgbChannel;
fn get_spread(&self) -> bool;
fn get_position(&self) -> &ImagePosition;
}
pub enum ImageFormat {
Jpeg,
Png,
Bmp
}
impl From<image::ImageFormat> for ImageFormat {
fn from(f: image::ImageFormat) -> Self {
f.into()
}
}