Rust初心者です。ぼちぼちやってます。
Rust による画像ファイルの処理を調べてみました。
image クレートを使用します。
C:\work> cargo add image
以下、サンプルコードと処理結果の画像ファイルです。
// run.rs
use image::error::ImageResult;
use image::io::Reader;
use image::ImageFormat;
use image::imageops::FilterType;
pub fn process() -> ImageResult<()> {
// 画像ファイルを読みだしてイメージデータを取得
let mut image = Reader::open("image.png")?
.decode()?;
// イメージデータのサイズ(横×縦)の確認
let width = image.width();
let height = image.height();
println!("size = {}x{}", width, height);
// イメージデータ右下の四分の一をクロップ
let image2 = image.crop(width/2, height/2, width/2, height/2);
// ファイルに保存。
// 画像フォーマットは保存先ファイルの拡張子で判別。PNG 形式で保存
image2.save("image2.png")?;
// イメージデータを画像フォーマットを指定してファイルに保存。
// image3.save_with_format("image2.dat", ImageFormat::Bmp)?; // BMP 形式で保存
// 90度回転 / 180度回転 / 270度回転
let image3 = image2.rotate90(); // .rotate180(); // .rotate270();
image3.save("image3.png")?;
// リサイズ(4倍に拡大・ガウシアンフィルタを使用)
let image4 = image3.resize(image3.width()*2, image3.height()*2, FilterType::Gaussian);
image4.save("image4.png")?;
// 上下の鏡像
let image5 = image4.flipv();
image5.save("image5.png")?;
// 左右の鏡像
let image6 = image5.fliph();
image6.save("image6.png")?;
// グレイスケール
let mut image7 = image6.grayscale();
image7.save("image7.png")?;
// インバート
image7.invert();
image7.save("image8.png")?;
Ok(())
}
以上。