1use crate::{
2 kernel::{Kernel2D, MagicKernel, Sharp2013, Sharp2021},
3 ImageF64,
4};
5
6#[derive(PartialEq, Eq)]
9pub enum Version {
10 MagicKernel,
12 MagicKernelSharp2013,
14 MagicKernelSharp2021,
16}
17
18pub fn magic_resize(
42 image: &ImageF64,
43 version: Version,
44 new_width: Option<u32>,
45 new_height: Option<u32>,
46) -> ImageF64 {
47 let new_size = match (new_width, new_height) {
48 (Some(new_width), Some(new_height)) => (new_width, new_height),
49 (Some(new_width), None) => {
50 let factor = new_width as f64 / image.width() as f64;
51 let new_height = (image.height() as f64 * factor) as u32;
52 (new_width, new_height)
53 }
54
55 (None, Some(new_height)) => {
56 let factor = new_height as f64 / image.height() as f64;
57 let new_width = (image.width() as f64 * factor) as u32;
58 (new_width, new_height)
59 }
60 (None, None) => (image.width(), image.height()),
61 };
62
63 let size = (image.width(), image.height());
64
65 if new_size.0 >= size.0 {
66 match version {
67 Version::MagicKernel => {
68 Kernel2D::new::<MagicKernel>(size, new_size).apply(image)
69 }
70 Version::MagicKernelSharp2013 => {
71 let img = Kernel2D::new::<Sharp2013>(size, size).apply(image);
72 Kernel2D::new::<MagicKernel>(size, new_size).apply(&img)
73 }
74 Version::MagicKernelSharp2021 => {
75 let img = Kernel2D::new::<Sharp2013>(size, size).apply(image);
76 let img = Kernel2D::new::<Sharp2021>(size, size).apply(&img);
77 Kernel2D::new::<MagicKernel>(size, new_size).apply(&img)
78 }
79 }
80 } else {
81 match version {
82 Version::MagicKernel => {
83 Kernel2D::new::<MagicKernel>(size, new_size).apply(image)
84 }
85 Version::MagicKernelSharp2013 => {
86 let img = Kernel2D::new::<MagicKernel>(size, new_size).apply(image);
87 Kernel2D::new::<Sharp2013>(new_size, new_size).apply(&img)
88 }
89 Version::MagicKernelSharp2021 => {
90 let img = Kernel2D::new::<MagicKernel>(size, new_size).apply(image);
91 let img = Kernel2D::new::<Sharp2013>(new_size, new_size).apply(&img);
92 Kernel2D::new::<Sharp2021>(new_size, new_size).apply(&img)
93 }
94 }
95 }
96}