Note

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

こちらの続きです。

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

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

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]

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