【Rust】画像ファイルのリサイズ


プロジェクト作成

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::DynamicImageresize(&self, nwidth: u32, nheight: u32, filter: imageops::FilterType) メソッドによりリサイズ
  • リサイズは、nwidth x nheight に収まるように、縦横比を固定した形でのリサイズとなる
  • imageops::FilterType には Nearest, Triangle, CatmullRom, Gaussian, Lanczos3 の何れかを指定できる(右に行くほど処理時間がかかる)(一部の関数はデバッグ モードでは非常に遅いため、パフォーマンスの問題が発生した場合は、必ずリリース モードを使用する)
  • リサイズ後の DynamicImagesave で保存


以下のように実行すれば、200x200ピクセルに収まるようにリサイズした画像が取得できる。

cargo run Lenna.png 200