use clap::ArgEnum; use image::imageops::FilterType; use image::{imageops, GenericImage, ImageBuffer, Pixel}; use serde::{Deserialize, Serialize}; #[derive(Copy, Clone, Serialize, Deserialize, ArgEnum, Debug)] pub enum FlipDirection { #[serde(rename = "vertical")] Vertical, #[serde(rename = "horizontal")] Horizontal, #[serde(rename = "both")] Both, } pub fn flip<T: GenericImage>( image: &T, dir: FlipDirection, ) -> anyhow::Result<ImageBuffer<T::Pixel, Vec<<T::Pixel as Pixel>::Subpixel>>> where T::Pixel: 'static, <T::Pixel as Pixel>::Subpixel: 'static, { use FlipDirection::*; match dir { Vertical => Ok(imageops::flip_vertical(image)), Horizontal => Ok(imageops::flip_horizontal(image)), Both => { let mut image = imageops::flip_horizontal(image); imageops::flip_vertical_in_place(&mut image); Ok(image) } } }