簡易反射光露出計アプリ for Android


10年以上前、携帯電話にカメラが搭載され始めた頃にデジタル一眼レフのように、絞り、シャッタースピードを表示していてくれたら便利なのになあと思っていました。古いカメラは露出計が付いていないので勘で露出を合わせるか、携帯型の露出計を持ち歩く必要が有ります。なので携帯で代用できればわざわざ露出計を用意しなくてもよいわけです。これが露出計アプリを作成しようと思った動機です。

ダウンロード

このアプリはGoolePlayで公開しています。
簡易反射光露出計

ソースコード

このアプリはオープンソースです。ソースコードはGitHubで公開しています。
https://github.com/mugcupsoup/SimpleReflectedLightMeter

露出計アプリの説明

この露出計アプリの使い方の説明です。
device-2013-04-12-163319
アプリを起動すると、カメラのプレビュー画面が表示されます。初めにカメラで使用するフィルムに合わせISO値を設定画面で設定します。デフォルトでは100になっています。自分が撮影したい対象をプレビュー画面で表示させ測光ボタンを押します。device-2013-04-12-163453
表示結果の画面に移動してここにEV値、F:絞り、T:シャッタースピード、ISO:フィルム感度が表示されます。絞りとシャッタースピードはボリュームボタンの上下で調整して、適当な値に合わせる事が出来ます。
画面下部に、プレビュー画面のサムネイルと付属のデジカメで出力されたJPGのExif情報を表示しています。このサムネイルを見てこの露出結果がオーバー気味かアンダー気味かの判断に利用できます。使用しているAndroidデバイスによって対応しているEV値の範囲は異なります。例としてXperia X10 miniは 4.6から14.3の範囲しか対応していません。快晴時はEV値は15以上になるケースがあるので露出オーバーにならないよう注意が必要です。

露出計アプリの要求仕様

1.カメラプレビュー画面で撮影対象を決定
2.測定ボタンを押したらISO感度に合わせた絞り値、シャッタースピード値を表示
3.上下ボタン操作で絞り、シャーッタースピードの値をEV値を元に計算して変更

これだけあれば露出計として十分役割を果たしてくれます。

露出計として使えそうなハードウエア機能

Andoridには照度センサが付いてます。これは周囲の明るさに応じて画面の輝度の調整などに使われています。この明るさの値も自由に取得できますが、そもそも手元の明るさが分かってもあまり意味ありません(手元が影で撮影対象が日光下にある場合など)。なので撮影時の露出計代わりとしては実用性がないので、照度センサを利用するという案は没となりました。入射光測光方式ではありかもしれない。でも入射光測光ってあんまりつかわないしなあ。

iPhoneですが入射光測光方式で良さそうだと感じたのはこれとかですね。単体露出計のように白いカバーをセンサーにかぶせて測光しています。
Luxi ~ Incident light meter adapter for iPhone

反射光測光を行いたいのであればカメラのセンサーの情報を取得できればいいんじゃ無かろうかという考えを思いつきました。しかし、Androidの開発向けの仕様を見る限りプレビュー時の撮影対象の露出情報取得などそんなニッチなAPIがあるはずも無く、Andorid OS経由でしかカメラデバイスにアクセスできないのでどうしようもありません。

次に通常デジカメで撮影されたJPGファイルには露出情報(絞り値、露出時間、ISO感度)が含まれているのに気がつきました。この値があればEV値が算出できるので露出計として十分利用できるんじゃなかろうかと。AndroidのCamera APIで書き出されるJPGにもちゃんと含まれています。これで先ほどの要求仕様が満たすことができます。

Exif情報の取得

JPGはヘッダー領域にデジカメでの撮影時の情報が書き込まれます。これらの情報はPC等のソフトウェアで利用できるよう規格として公開されています。

Exif 2.21の規格
http://www.cipa.jp/hyoujunka/kikaku/pdf/DC-008_J.pdf

絞り値、露出時間、ISO感度もExif領域に書き込まれています。android.media.ExifInterfaceを利用するという手が有りますが、プレビューから出力された画像を一度ファイルとして保存しないと利用できないという問題点がありました。頻繁にSDカードに書き込みはしたくなかったのでandroid.media.ExifInterfaceを利用するという案は没となりました。なのでこれらの値を取得するために自前でExif情報を取得するための処理を用意しました。画像に含まれているサムネイルなんかもここから取得しています。

Exif情報の取得例

import com.gmail.mugucupsoup.android.Exif.*;

public void readExif(byte[] data) {// dataはjpegデータ
	ExifInfomation ei = new ExifInfomation();
	try {
		ei.readImage(data, true);
		System.out.println("##Tiff IFD");
		ei.print(ei.getTiffTags());
		System.out.println("##Exif IFD");
		ei.print(ei.getExifTags());
		System.out.println("##GPS IFD");
		ei.print(ei.getGpsTags());
		System.out.println("##Interoperability IFD");
		ei.print(ei.getItpIdfTags());
		ei.getExifTumbnail().writeImage("test.jpg");
	} catch (IOException e1) {
		e1.printStackTrace();
		return;
	}
}

上のコードの出力結果例。これらのパラメータ名と値についてはExif規格書で解説されています。

##Tiff IFD
Software:2.3.4
Orientation:1
DateTime:2013:03:26 12:55:00
Model:MotoA953
YCbCrPositioning:1
ResolutionUnit:2
YResolution:300
ExifIFDPointer:686
XResolution:300
Make:Motorola
##Exif IFD
ExposureMode:0
WhiteBalance:0
UserComment:ASCII 
SceneCaptureType:0
Flash:16
GainControl:1
LightSource:20
DigitalZoomRatio:0
FocalLengthIn35mmFilm:30
FocalLength:4
Sharpness:0
MaxApertureValue:760/256
PixelXDimension:2592
ExposureBiasValue:0
PixelYDimension:1456
Contrast:0
MeteringMode:2
FlashpixVersion:0100
Saturation:0
SubjectDistance:0
ColorSpace:1
ShutterSpeedValue:2809/256
SubjectDistanceRange:0
BrightnessValue:2262/256
ApertureValue:760/256
InteroperabilityIFD:1472
ImageUniqueID:
ExifVersion:0220
DateTimeOriginal:2013:03:26 12:55:00
DateTimeDigitized:2013:03:26 12:55:00
SensingMethod:2
ExposureProgram:2
CompressedBitsPerPixel:4
FNumber:280/100
ExposureIndex:62
ComponentsConfiguration:
FileSource:
SceneType:
ISOSpeedRatings:62
ExposureTime:498/1000000
##GPS IFD
##Interoperability IFD
InteroperabilityIndex:R98
InteroperabilityVersion:0100

これらのパラメータ名と値についてはExif規格書で解説されています。この出力から使用する情報は3つの値です。
FNumber:280/100
ExposureTime:498/1000000
ISOSpeedRatings:62
FNumberは絞り、ExposureTimeはシャッタースピード、ISOSpeedRatingsはISOフィルム感度です。

EV値の計算

EVは以下の計算式で算出されます。
EV = log2F2 - log2T - log2(ISO/100)
F:絞り、T:シャッタースピード、ISO:フィルム感度

この関係式から、カメラに設定するシャッタースピード、絞りの値を求められます。

まとめのようなもの

フィルムカメラは、カメラにフィルムをセットし撮影後に、フィルムを現像、プリント現像というプロセスを経ないといけない訳ですがデジカメはものすごく単純です。シャッターボタンを押すだけで後はパソコンに接続するだけです。もはやフィルムを使うメリットは無いと言えるでしょう。しかしあえて古いカメラを使いフィルムで撮影してみると意外と新たな発見ができるかもしれません。それが何かは人それぞれによると思います。そんな人たちにこのアプリが役立ってくれると幸いです。

簡易反射光露出計アプリ for Android」への1件のフィードバック

コメントは停止中です。