Skip to content

Commit fbb77be

Browse files
committed
scaledown
1 parent 56ff163 commit fbb77be

17 files changed

Lines changed: 61 additions & 3 deletions

β€Žassets/food.jpgβ€Ž

23.9 MB
Loading

β€Žsrc/gradient/gradient.rsβ€Ž

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ use std::path::PathBuf;
33
use image::{Pixel, Rgba, RgbaImage};
44

55
pub fn gradient_image() {
6-
let p = PathBuf::new();
7-
let p = p.join("src");
8-
let gradient_path = p.join("gradient");
6+
let gradient_path = PathBuf::from("src/gradient");
97

108
let mut img = RgbaImage::new(500, 500);
119

β€Žsrc/main.rsβ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use fractal::fractal::fractal_image;
22
use gradient::gradient::gradient_image;
3+
use scaledown::scaledown::scaledown_image;
34

45
pub mod fractal;
56
pub mod gradient;
7+
pub mod scaledown;
68

79
fn main() {
810
fractal_image();
911
gradient_image();
12+
scaledown_image();
1013
}

β€Žsrc/scaledown/mod.rsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod scaledown;

β€Žsrc/scaledown/scaledown.rsβ€Ž

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use image::imageops::FilterType;
2+
use image::ImageFormat;
3+
use std::fmt;
4+
use std::fs::File;
5+
use std::path::PathBuf;
6+
use std::time::{Duration, Instant};
7+
pub fn scaledown_image() {
8+
let path = PathBuf::from("assets/food.jpg");
9+
let seve_path = PathBuf::from("src/scaledown");
10+
let img = image::open(path).unwrap();
11+
for &(name, filter) in [
12+
("near", FilterType::Nearest),
13+
("tri", FilterType::Triangle),
14+
("cmr", FilterType::CatmullRom),
15+
("gauss", FilterType::Gaussian),
16+
("lcz2", FilterType::Lanczos3),
17+
]
18+
.iter()
19+
{
20+
let timer = Instant::now();
21+
let scaled = img.resize(800, 800, filter);
22+
println!("Scaled by {} in {}", name, Elapsed::from(&timer));
23+
let path = seve_path.join(format!("test-{}.png", name));
24+
let mut output = File::create(path).unwrap();
25+
scaled.write_to(&mut output, ImageFormat::Png).unwrap();
26+
}
27+
28+
for size in &[400_u32, 600, 800] {
29+
let timer = Instant::now();
30+
let scaled = img.thumbnail(*size, *size);
31+
println!("Thumbnailed to {} in {}", size, Elapsed::from(&timer));
32+
let path = seve_path.join(format!("test-thumb{}.png", size));
33+
let mut output = File::create(path).unwrap();
34+
scaled.write_to(&mut output, ImageFormat::Png).unwrap();
35+
}
36+
}
37+
38+
struct Elapsed(Duration);
39+
40+
impl Elapsed {
41+
fn from(start: &Instant) -> Self {
42+
Elapsed(start.elapsed())
43+
}
44+
}
45+
46+
impl fmt::Display for Elapsed {
47+
fn fmt(&self, out: &mut fmt::Formatter) -> Result<(), fmt::Error> {
48+
match (self.0.as_secs(), self.0.subsec_nanos()) {
49+
(0, n) if n < 1000 => write!(out, "{} ns", n),
50+
(0, n) if n < 1_000_000 => write!(out, "{} Β΅s", n / 1000),
51+
(0, n) => write!(out, "{} ms", n / 1_000_000),
52+
(s, n) if s < 10 => write!(out, "{}.{:02} s", s, n / 10_000_000),
53+
(s, _) => write!(out, "{} s", s),
54+
}
55+
}
56+
}

β€Žsrc/scaledown/test-cmr.pngβ€Ž

780 KB
Loading

β€Žsrc/scaledown/test-gauss.pngβ€Ž

713 KB
Loading

β€Žsrc/scaledown/test-lcz2.pngβ€Ž

804 KB
Loading

β€Žsrc/scaledown/test-near.pngβ€Ž

928 KB
Loading
17.5 KB
Loading

0 commit comments

Comments
 (0)