プロジェクト作成
cargo init resize_img cd resize_img
image クレートを追加
cargo add image
image クレートを使い、以下のようにリサイズ処理を実装できる。
use std::error::Error; use image::imageops::FilterType; fn main() -> Result<(), Box<dyn Error>> { let mut args = std::env::args().skip(1); assert_eq!(args.len(), 2, "Arguments must be: file_path size"); let file_path = args.next().unwrap(); let size = args.next().unwrap().parse()?; let img = image::open(&file_path)?; let resized = img.resize(size, size, FilterType::Lanczos3); resized.save(file_path.replace(".", "-resized."))?; Ok(()) }
image::open
で画像ファイルをオープンし、image::DynamicImage
を取得(画像ファイルのフォーマットは、拡張子から特定)
ファイルコンテンツからフォーマットを特定するには image::io::Reader
を使って以下のようにする。
let image = Reader::open("path/to/image.png")? .with_guessed_format()? .decode()?;
image::DynamicImage
のresize(&self, nwidth: u32, nheight: u32, filter: imageops::FilterType)
メソッドによりリサイズ- リサイズは、
nwidth
xnheight
に収まるように、縦横比を固定した形でのリサイズとなる imageops::FilterType
にはNearest
,Triangle
,CatmullRom
,Gaussian
,Lanczos3
の何れかを指定できる(右に行くほど処理時間がかかる)(一部の関数はデバッグ モードでは非常に遅いため、パフォーマンスの問題が発生した場合は、必ずリリース モードを使用する)- リサイズ後の
DynamicImage
をsave
で保存
以下のように実行すれば、200x200ピクセルに収まるようにリサイズした画像が取得できる。
cargo run Lenna.png 200