NOTO

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

 Date:2019-01-03 00:25:35 +0900
 Categories: TECHNOLOGY

こちらの続きです。

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

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

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]

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

Tweet