added resize-stretch feature

This commit is contained in:
rexept
2024-10-25 19:03:53 -06:00
parent 5142863181
commit d581b9e703
3 changed files with 47 additions and 0 deletions

View File

@@ -212,6 +212,8 @@ pub enum ResizeStrategy {
Crop,
/// Resize the image to fit inside the screen, preserving the original aspect ratio
Fit,
/// Resize the image to stretch across the screen
Stretch,
}
#[derive(Parser)]

View File

@@ -205,6 +205,7 @@ pub fn compress_frames(
ResizeStrategy::No => img_pad(&first_img, dim, color)?,
ResizeStrategy::Crop => img_resize_crop(&first_img, dim, filter)?,
ResizeStrategy::Fit => img_resize_fit(&first_img, dim, filter, color)?,
ResizeStrategy::Stretch => img_resize_stretch(&first_img, dim, filter)?,
};
let mut canvas: Option<Box<[u8]>> = None;
@@ -217,6 +218,7 @@ pub fn compress_frames(
ResizeStrategy::No => img_pad(&img, dim, color)?,
ResizeStrategy::Crop => img_resize_crop(&img, dim, filter)?,
ResizeStrategy::Fit => img_resize_fit(&img, dim, filter, color)?,
ResizeStrategy::Stretch => img_resize_crop(&img, dim, filter)?,
};
if let Some(canvas) = canvas.as_ref() {
@@ -382,6 +384,46 @@ pub fn img_resize_fit(
}
}
pub fn img_resize_stretch(
img: &Image,
dimensions: (u32, u32),
filter: FilterType,
) -> Result<Box<[u8]>, String> {
let (width, height) = dimensions;
let resized_img = if (img.width, img.height) != (width, height) {
let pixel_type = if img.format.channels() == 3 {
PixelType::U8x3
} else {
PixelType::U8x4
};
let src = match fast_image_resize::images::ImageRef::new(
img.width,
img.height,
img.bytes.as_ref(),
pixel_type,
) {
Ok(i) => i,
Err(e) => return Err(e.to_string()),
};
let mut dst = fast_image_resize::images::Image::new(width, height, pixel_type);
let mut resizer = Resizer::new();
let options = ResizeOptions::new()
.resize_alg(ResizeAlg::Convolution(filter));
if let Err(e) = resizer.resize(&src, &mut dst, Some(&options)) {
return Err(e.to_string());
}
dst.into_vec().into_boxed_slice()
} else {
img.bytes.clone()
};
Ok(resized_img)
}
pub fn img_resize_crop(
img: &Image,
dimensions: (u32, u32),

View File

@@ -184,6 +184,9 @@ fn make_img_request(
ResizeStrategy::Fit => {
img_resize_fit(&img_raw, dim, make_filter(&img.filter), &img.fill_color)?
}
ResizeStrategy::Stretch => {
img_resize_stretch(&img_raw, dim, make_filter(&img.filter))?
}
};
img_req_builder.push(