#[derive(Debug)]
pub struct ScaleParam {
pub src_width: u32,
pub src_height: u32,
pub dst_width: u32,
pub dst_height: u32,
pub scale_width: f32,
pub scale_height: f32,
}
impl ScaleParam {
pub fn new(
src_width: u32,
src_height: u32,
dst_width: u32,
dst_height: u32,
scale_width: f32,
scale_height: f32,
) -> Self {
Self {
src_width,
src_height,
dst_width,
dst_height,
scale_width,
scale_height,
}
}
pub fn get_scale_param(src: &image::RgbImage, target_size: u32) -> Self {
let src_width = src.width();
let src_height = src.height();
let mut dst_width;
let mut dst_height;
let ratio: f32 = if src_width > src_height {
target_size as f32 / src_width as f32
} else {
target_size as f32 / src_height as f32
};
dst_width = (src_width as f32 * ratio) as u32;
dst_height = (src_height as f32 * ratio) as u32;
if dst_width % 32 != 0 {
dst_width = (dst_width / 32) * 32;
dst_width = dst_width.max(32);
}
if dst_height % 32 != 0 {
dst_height = (dst_height / 32) * 32;
dst_height = dst_height.max(32);
}
let scale_width = dst_width as f32 / src_width as f32;
let scale_height = dst_height as f32 / src_height as f32;
Self::new(
src_width,
src_height,
dst_width,
dst_height,
scale_width,
scale_height,
)
}
}
impl std::fmt::Display for ScaleParam {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"src_width:{},src_height:{},dst_width:{},dst_height:{},scale_width:{},scale_height:{}",
self.src_width,
self.src_height,
self.dst_width,
self.dst_height,
self.scale_width,
self.scale_height
)
}
}