ホームページ作成支援ツール・撮影時刻取得

このツールで撮影ポイントを取得するのは、画像の Exif 情報の撮影時刻とGPSが数秒毎に記録した時刻とを照合して得ている。
しかし、GPSは数秒間隔でデータを記録しているので、撮影時刻とGPS時刻が完全一致することは望めないので、その2つの時刻差が最も小さくなった時点を撮影ポイントとすることにした。
その時刻差は最大でも3秒程度の誤差で得られるので、歩きの場合は撮影ポイントの位置は大体2~3m程度の精度で得られることになる。

PHP なら簡単に Exif 情報を取り出せるらしいが、勉強不足で PHP は使えないので、我流で VBScript で無理やり撮影時刻を得ることにした。
その方法は、あまりにも稚拙な方法だから公開するのは憚られたので、今まで日記には書かなかったが恥を忍んで公開します。

画像はバイナリーデータだが、テキストエディタで覗いてみると、日付と時刻、および使用カメラなどの情報だけは正常に読み取ることができるので、これを手掛かりに

  1. 1,2,3,4,6,7,9,10,12,13,15,16,18,19番目の文字が半角数字であること
  2. 5,8,14,17番目の文字が「:」であること
  3. 11番目の文字が半角スペースであること
  4. 以上の3条件を満足し、且つそれが2回目に出現した場合は撮影時刻、1回目は更新時刻よう??

以上の条件は正しくないかもしれないが、Exif 情報の撮影時刻や更新時刻、作成時刻などを変化させて実験してみると、どうやら2番目の日時情報が撮影時刻のようだということが分かった。
その後何年もこれを使っているが問題はないので、たぶん間違いではないだろうと思っている。

なお、Function の最後の方で、当ツールで設定する、GPS時計(衛星電波で校正された非常に正確な時計)とカメラの内臓時計の誤差を補正しています。

'--------------------------------------------
'function funcExifTimeGet Exifタイム取得
'--------------------------------------------
Function funcExifTimeGet(Filname, Offset)

	Dim jpgFil, i, j, binDate(9), binTime(7), binData(19)
	Dim byt, jpgTimeStr

	set jpgFil = CreateObject("ADODB.Stream")
	jpgFil.Open
	jpgFil.Type = 1
	jpgFil.LoadFromFile(Filname)

	Flag = 0
	i = 0
	Do
		i = i + 1
		byt = jpgFil.Read(1)
		Select Case i
			Case 1,2,3,4,6,7,9,10,12,13,15,16,18,19			'この番号の処が数字(0~9)であること
				If AscB(midb(byt,1))=>48 And AscB(midb(byt,1))=<57 Then
					binData(i) = Chr(AscB(midb(byt,1)))
				Else
					i = 0
				End If
			Case 5,8,14,17						'この番号の処がコロン(:)であること
				If Chr(AscB(midb(byt,1)))=":" Then
					binData(i) = Chr(AscB(midb(byt,1)))
				Else
					i = 0
				End If
			Case 11							'この番号の処が半角スペースであること
				If Chr(AscB(midb(byt,1)))=" " Then
					binData(i) = Chr(AscB(midb(byt,1)))
				Else
					i = 0
				End If
		End Select

		'以上の条件が全部揃って且つ2番目に出現したものを撮影日時とする。1番目は更新日時のようです
		If Flag=0 And i=19 Then
			i = 0
			Flag = 1
		ElseIf Flag=1 And i=19 Then
			Exit Do
		End If
	Loop
	jpgFil.Close

	jpgDateStr = ""
	For i=1 To 19
		If i<10 And binData(i) = ":" Then				'日付の区切りを「:」→「/」に変換する
			binData(i) = "/"
		End If
		jpgDateStr = jpgDateStr & binData(i)
	Next

	jpgDate = DateAdd("s", Offset, CDate(jpgDateStr))			'カメラ内蔵時計の時刻とGPS時刻(正確)の誤差分を補正
	funcExifTimeGet = CStr(jpgDate)						'戻り値
End Function

現在位置: ホームなんでも日記メニュー > このページ