複数の引数を処理できるようにする

こちらの続きです。

前回までで写真を読み取って表示したい項目を表示できるようになったので、複数の画像ファイルを扱えるようにしたいと思います。

引数をイテレートして処理する

1つ目の引数をskipする

以前引数が入っているargsの1つ目は実行パスだった記憶があったので、1つ目をスキップするようにする

[rust]
// code
use std::env;
use rexiv2;
fn main() {
let arguments = env::args().skip(1);
println!(“{:?}”, arguments);
}
// result
ktmt-brkt:exif[master *]$ cargo run /Users/ryo/Downloads/Photos/DSC04117.jpg /Users/ryo/Downloads/Photos/DSC04118.jpg /Users/ryo/Downloads/Photos/DSC04119.jpg
Compiling exif v0.1.0 (/Users/ryo/work/ryo/study_rust/exif) Finished dev [unoptimized + debuginfo] target(s) in 0.72s
Running `target/debug/exif /Users/ryo/Downloads/Photos/DSC04117.jpg /Users/ryo/Downloads/Photos/DSC04118.jpg /Users/ryo/Downloads/Photos/DSC04119.jpg`
Skip { iter: Args { inner: [“target/debug/exif”, “/Users/ryo/Downloads/Photos/DSC04117.jpg”, “/Users/ryo/Downloads/Photos/DSC04118.jpg”, “/Users/ryo/Downloads/Photos/DSC04119.jpg”] }, n: 1 }[/rust]

Skip { … } が結果として返ってくることがわかった。これをイテレートすれば良さそう。

引数をイテレートする

引数のイテレートは以下のような書き方ができるみたい

[rust]for argument in env::args() {
println!(“{}”, argument);
}[/rust]

コードに取り入れていく

この2つを今までのコードに取り入れていくと以下のような感じ。

[rust]
use std::env;
use rexiv2;
fn main() {
let arguments = env::args().skip(1);
for argument in arguments {
let meta = rexiv2::Metadata::new_from_path(&argument).unwrap();
println!(“[{}]”, argument);
println!(“Width: {:?}”, meta.get_pixel_width());
println!(“Height: {:?}”, meta.get_pixel_height());
println!(“F: {:?}”, meta.get_fnumber().unwrap());
println!(“ISO: {:?}”, meta.get_iso_speed().unwrap());
println!(“Shutter: {:?}/{:?}”, meta.get_exposure_time().unwrap().numer(), meta.get_exposure_time().unwrap().denom());
}
}
[/rust]

実行結果(3つの画像を引数にとってる)

[rust]
ktmt-brkt:exif[master *]$ cargo run /Users/ryo/Downloads/Photos/DSC04117.jpg /Users/ryo/Downloads/DSC03120.jpg /Users/ryo/Downloads/DSC03190.jpg // こめんど部分
Finished dev [unoptimized + debuginfo] target(s) in 0.08s
Running `target/debug/exif /Users/ryo/Downloads/Photos/DSC04117.jpg /Users/ryo/Downloads/DSC03120.jpg /Users/ryo/Downloads/DSC03190.jpg`
[/Users/ryo/Downloads/Photos/DSC04117.jpg] // 1つ目の結果
Width: 6000
Height: 4000
F: 1.8
ISO: 320
Shutter: 1/200
[/Users/ryo/Downloads/DSC03120.jpg] // 2つ目の結果
Width: 3936
Height: 2624
F: 4.0
ISO: 16000
Shutter: 1/125
[/Users/ryo/Downloads/DSC03190.jpg] // 3つ目の結果
Width: 3936
Height: 2624
F: 4.0
ISO: 5000
Shutter: 1/100
[/rust]

もっと良い書き方があるのだろうけど、ひとつひとつ。本当はもっと包括的にやっていきたい。でも一つ一つ。ファイルパスが正しくないときのエラー処理などを次はやっていきたい。