NOTO

RustでExifのデータを読んで見る

 Date:2018-12-23 03:40:47 +0900
 Categories: TECHNOLOGY

概要

RustでExifのデータを読んで見る。Rustが全然かけないので、とりあえずがむしゃらにやって見る。です。作業メモ。

準備

Exifを読むためのライブラリを探したところ以下のものが比較的多くダウンロードされていそう。

[embed]https://github.com/felixc/rexiv2[/embed]

このページに従って、コードを書いてみたがライブラリを読み込んでいないことを思い出した。

# console
$ cargo init

Cargo.tomlというものができるので、dependenciedにこのCrateを記載。

[package]
name = "exif"
version = "0.1.0"
authors = ["Katsumata Ryo <katsumata@stores.jp>"]
edition = "2018"

[dependencies]
rexiv2 = "0.7.0" // <- これ

buildしてみる

$ cargo run Updating[crates.io](http://crates.io)index Downloaded rexiv2 v0.7.0
Downloaded gexiv2-sys v1.0.0
Downloaded num-rational v0.2.1
Downloaded libc v0.2.45
Downloaded pkg-config v0.3.14
Downloaded num-traits v0.2.6
Downloaded num-integer v0.1.39
Compiling num-traits v0.2.6
Compiling libc v0.2.45
Compiling num-integer v0.1.39
Compiling pkg-config v0.3.14
Compiling num-rational v0.2.1
Compiling gexiv2-sys v1.0.0
error: failed to run custom build command forgexiv2-sys v1.0.0
process didn't exit successfully:/Users/ryo/work/ryo/study_rust/exif/target/debug/build/gexiv2-sys-806d287d621f3889/build-script-build(exit code: 101) --- stdout

The gexiv2 library was not found by pkg-config on your system.Consult the README.md file for suggestions on how to acquire it.--- stderrthread 'main' panicked at '`"pkg-config" "--libs" "--cflags" "gexiv2"` did not exit successfully: exit code: 1--- stderrPackage gexiv2 was not found in the pkg-config search path.Perhaps you should add the directory containing `gexiv2.pc'to the PKG_CONFIG_PATH environment variableNo package 'gexiv2' found', /Users/ryo/.cargo/registry/src/github.com-1ecc6299db9ec823/gexiv2-sys-1.0.0/build.rs:28:13note: Run with `RUST_BACKTRACE=1` for a backtrace.warning: build failed, waiting for other jobs to finish...error: build failed

どうやら gexiv2 がなさそう。これはRustのものじゃなくてそもそも別のライブラリっぽかったのでhomebrewでインストールできそうだった。

brew install gexiv2==> Installing dependencies for gexiv2: exiv2, pcre and glib==> Installing gexiv2 dependency: exiv2==> Downloading <https://homebrew.bintray.com/bottles/exiv2-0.26.mojave.bottle.1>.######################################################################## 100.0%==> Pouring exiv2-0.26.mojave.bottle.1.tar.gz🍺 /usr/local/Cellar/exiv2/0.26: 55 files, 7.6MB==> Installing gexiv2 dependency: pcre==> Downloading <https://homebrew.bintray.com/bottles/pcre-8.42.mojave.bottle.tar>######################################################################## 100.0%==> Pouring pcre-8.42.mojave.bottle.tar.gz🍺 /usr/local/Cellar/pcre/8.42: 204 files, 5.5MB==> Installing gexiv2 dependency: glib==> Downloading <https://homebrew.bintray.com/bottles/glib-2.58.2.mojave.bottle.t>######################################################################## 100.0%==> Pouring glib-2.58.2.mojave.bottle.tar.gz🍺 /usr/local/Cellar/glib/2.58.2: 435 files, 18.5MB==> Installing gexiv2==> Downloading <https://homebrew.bintray.com/bottles/gexiv2-0.10.9.mojave.bottle>######################################################################## 100.0%==> Pouring gexiv2-0.10.9.mojave.bottle.tar.gz🍺 /usr/local/Cellar/gexiv2/0.10.9: 22 files, 496KB

よっしゃ。

コード

とりあえずドキュメントを読んでみて、流儀に外れていてもとりあえず読み込めるものを作ることを頑張った。

use rexiv2;

fn main() {
let file = "/Users/ryo/Downloads/Photos/DSC04117.jpg";
let meta = rexiv2::Metadata::new_from_path(&file).unwrap();

println!("{:?}", meta.get_pixel_width());
println!("{:?}", meta.get_pixel_height());
println!("F: {:?}", meta.get_fnumber());
println!("ISO: {:?}", meta.get_iso_speed());
println!("{:?}", meta.get_exposure_time());
}

実行

$ cargo run
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`
6000
4000
F: Some(1.8)
ISO: Some(320)
Some(Ratio { numer: 1, denom: 200 })

なんか変だけど、それっぽいのがとれている気がする!この記事では一旦ここまで。

今後

以下の事ができると自分がやりたいことにとりあえず追いつくので

Tweet