use clap::ArgEnum; use image::{imageops, GenericImage, Pixel}; use serde::{Deserialize, Serialize}; use crate::TypedOutputFormat; #[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<TypedOutputFormat<T>> 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) } } }