Skip to content
Snippets Groups Projects
flip.rs 847 B
Newer Older
Louis's avatar
Louis committed
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)
		}
	}
}