Rust の Exif 事情

スポンサーリンク

概要

最近 Rust を使って少し遊んでいて、ふと簡単な画像・動画管理システム的なものを作ってみようかと思い立ちました。
そこで、勉強がてらコードを書いていたのですが、、、、Exif の取得で躓きました。
さすがに、一からバイナリ解析して情報を取得するレベルで頑張ろうという気はまだ起きていないので、いわゆる便利なライブラリ的なものを探していたのですが、、、、なかなかこれといったものが見つかりません。
Rust の情報って、少しレアな内容になるとほんとに日本語の情報少ないですね〜

といったわけで、けっこう調べたりしたのですが、そんな中で現状の行き詰まった状態を記しておきたいと思います。

使えそうなクレート

なんだかんだで関係の有りそうなクレートはけっこうあったのですが、自分的には 2022年3月時点では最終的に下記の二択になりました。

  • kamadak-exif
  • rexif

以降、それぞれの所感です。

kamadak-exif

https://crates.io/crates/kamadak-exif

おそらく、これが現在もっとも使われているのかなと思います。
使い勝手的には悪くないと思うが、Exif の仕様をあまりきちんと把握できていなくてこのクレートの仕様がいまいちよくわからなかったりしました。
概ね問題がないと思ったのですが、自分が保持している一部の画像で Exif 取得に失敗するケースがあり、そういう意味で完成度が若干疑わしい気がしています。
自分が遭遇したケースでは、Exif の読み込み時に下記のエラーが返ってきて取得できませんでした。

Unexpected next IFD

したがって、対応が必要な範囲の画像で試してみて、問題がなければこのクレートを使うという選択肢がいいかなと思います。

Exif データの取得例(全項目)

	Make primary "Apple"
	Model primary "iPhone SE (2nd generation)"
	Orientation primary row 0 at right and column 0 at top
	XResolution primary 72 pixels per inch
	YResolution primary 72 pixels per inch
	ResolutionUnit primary inch
	Software primary "14.4.1"
	DateTime primary 2021-03-23 19:39:48
	Tag(Tiff, 316) primary "iPhone SE (2nd generation)"
	YCbCrPositioning primary centered
	ExposureTime primary 1/60 s
	FNumber primary f/1.8
	ExposureProgram primary normal program
	PhotographicSensitivity primary 100
	ExifVersion primary 2.32
	DateTimeOriginal primary 2021-03-23 19:39:48
	DateTimeDigitized primary 2021-03-23 19:39:48
	OffsetTime primary "+09:00"
	OffsetTimeOriginal primary "+09:00"
	OffsetTimeDigitized primary "+09:00"
	ComponentsConfiguration primary YCbCr_
	ShutterSpeedValue primary 5.9077276079652545 EV
	ApertureValue primary 1.6959938128383605 EV
	BrightnessValue primary 3.190064093896206 EV
	ExposureBiasValue primary 0 EV
	MeteringMode primary spot
	Flash primary not fired, no return light detection function, suppressed
	FocalLength primary 3.99 mm
	SubjectArea primary rectangle (x=2724, y=1333, w=751, h=756)
	MakerNote primary 0x4170706c6520694f530000014d4d002100010009000000010000000c000200070000022e000001a00003000700000068000003ce0004000900000001000000010005000900000001000000b80006000900000001000000b60007000900000001000000010008000a0000000300000436000c000a000000020000044e000d00090000000100000001000e0009000000010000000000100009000000010000000100140009000000010000000a001600020000001d0000045e001700090000000122502000001900090000000100000002001a0002000000060000047c001f000900000001000000000020000200000025000004820021000a00000001000004a80023000900000002000004b000250009000000010000008a0026000900000001000000030027000a00000001000004b8002800090000000100000001002b000200000025000004c0002d000900000001000011d8002e00090000000100000001002f00090000000100000075003600090000000100000310003700090000000100000004003b00090000000100000000003c000900000001000000040000000062706c69737430304f11020027001c011f01e000e300c100ee00f300fb00e700fb000e01fb00d700bc006901500078011601b600e30003010e01f600b00028013d0173010b01bb007c00e2005c005a01b40098008f00e800030197008c00b9006b011701cc00a900b900b7007100c7008900850081008500940094008d00790091000001d500b400bb00a800a600ea005f007c007400680058008e0085006e0049008b00a700c200b300b900e4001c014d005c006c006a005c0052009b0060006c009e007d00b900d300c60027016601a70054007600bd0000018e0063005a002401ff009600c100d300e2004d015a0102019200ca00b100d0000901a600dc006d015101a7007100bb00c50056012c011601f3001501cc0081001b011f01050154015401ec0077008a0082007301da00e5000001e500f4009700260100011901ec00c400440043004a005c000e01b90052004a008200ed00bd00d400d4003101340160006100420038006900670198004d004600d500f4009400d300d600b000bb003800310037006200b2006201c0006900a800d500f800cb00ca00ef00bc0090001f001c0038009a00e9006a011d01b200cf00ee000601cd00de00d700fd0088004b003f004f00d50050014d013d01f50001012201fd00de00eb001f014b01f40085006b008500ce002a01ab003e013901360154014a014601360150017701640132011801110126017e010008000000000000020100000000000000010000000000000000000000000000020c62706c6973743030d4010203040506070855666c6167735576616c75655974696d657363616c655565706f636810011300002ad2e095329e123b9aca0010000811171d272d2f383d000000000000010100000000000000090000000000000000000000000000003fffffbd060001171fffffee4a00062b6fffff612f0000a3a00000000300000004000001710000010041537131766f663937635150797768787431523063574a37495a43610000713930306e0034444630373633302d414236432d344338442d393346442d36373430354635343246384500000000000000000001000000161000003b0001b22000000bd732434443303531452d373133342d343037382d413041462d3136433433434243373638350000
	SubSecTimeOriginal primary "109"
	SubSecTimeDigitized primary "109"
	FlashpixVersion primary 1.0
	ColorSpace primary uncalibrated
	PixelXDimension primary 4032 pixels
	PixelYDimension primary 3024 pixels
	SensingMethod primary one-chip color area sensor
	SceneType primary directly photographed image
	ExposureMode primary auto exposure
	WhiteBalance primary auto white balance
	FocalLengthIn35mmFilm primary 28 mm
	SceneCaptureType primary standard
	LensSpecification primary 3.9900000095374253-3.9900000095374253 mm, f/1.8-1.8
	LensMake primary "Apple"
	LensModel primary "iPhone SE (2nd generation) back camera 3.99mm f/1.8"
	CompositeImage primary composite (general)
	Compression thumbnail JPEG
	XResolution thumbnail 72 pixels per inch
	YResolution thumbnail 72 pixels per inch
	ResolutionUnit thumbnail inch
	JPEGInterchangeFormat thumbnail 2256
	JPEGInterchangeFormatLength thumbnail 9794

rexif

https://crates.io/crates/rexif

kamadak-exif でエラーが出る画像をなんとか対応したいと思って試した結果、良好だったのがこの rexif です。
しかも、rexif はファイル名を渡すだけでいいので、kamadak-exif と比べると使いやすいです。
その反面、細かいデータが取れていない気がしていますが、詳細は確認していないです。
そして、最大の欠点は PNG 形式に対応していないことです。
JPG と TIFF の Exif しか rexif は対応していないので、PNG が対応範囲に入っている場合には致命的な欠点となります。

Exif データの取得例(全項目)

	Manufacturer: Apple
	Model: iPhone SE (2nd generation)
	Orientation: Rotated to left
	X Resolution: 72 pixels per in
	Y Resolution: 72 pixels per in
	Resolution Unit: in
	Software: 14.4.1
	Image date: 2021:03:23 19:39:48
	Host computer: iPhone SE (2nd generation)
	Unknown to this library, or manufacturer-specific: 1
	This image has an Exif SubIFD: 252
	Exposure time: 1/60 s
	Aperture: f/1.8
	Exposure program: Program control
	ISO speed ratings: ISO 100
	Exif version: 0232
	Date of original image: 2021:03:23 19:39:48
	Date of image digitalization: 2021:03:23 19:39:48
	Unknown to this library, or manufacturer-specific: +09:00
	Unknown to this library, or manufacturer-specific: +09:00
	Unknown to this library, or manufacturer-specific: +09:00
	Unknown to this library, or manufacturer-specific: 1230
	Shutter speed: 5.9 Tv APEX
	Aperture value: 1.7 Av APEX
	Brightness value: 3.2 APEX
	Exposure bias value: 0.00 EV APEX
	Meteting mode: Spot
	Flash: Did not fire. Forced suppresion.
	Focal length: 3.99 mm
	Subject area: at rectangle 2724,1333 width 751 height 756
	Maker note: Blob of 1254 bytes
	Unknown to this library, or manufacturer-specific: 109
	Unknown to this library, or manufacturer-specific: 109
	Flashpix version: 0100
	Color space: Uncalibrated
	Unknown to this library, or manufacturer-specific: 4032
	Unknown to this library, or manufacturer-specific: 3024
	Sensing method: One-chip color area sensor
	Scene type: Directly photographed image
	Exposure mode: Auto exposure
	White balance mode: Auto
	Equivalent focal length in 35mm: 28 mm
	Scene capture type: Standard
	Lens specification: 3.9900000095374253 mm f/1.8
	Lens manufacturer: Apple
	Lens model: iPhone SE (2nd generation) back camera 3.99mm f/1.8
	Unknown to this library, or manufacturer-specific: 2

結論

全体としては Exif データの取得は kamadak-exif の方が優秀のように感じます。
したがって、基本的には kamadak-exif を使って取得し、エラーが発生する時には rexif を使って取得してみる、というアプローチで現在は進めています。

ほんとは kamadak-exif のコードを修正して PR を送ればいいんでしょうけどね〜(^_^;)

コメント

タイトルとURLをコピーしました