・・・またまた遅延。 真に おきつねさまくおりてぃww
って アレ、まだ完成はしていない。
・・・先のを うpしたアトに気付いたコトなのだが、今回、スクリプトの対象としているトコロのX3Fファイルってのは、
どうやらカメラ側の設定次第で、付随するデータの開始位置も変ってしまうようで、
文字列として抽出する範囲固定で処理しているようなブツでは、うまく対応できないと云う罠(-_-;)
また、撮影日時の値も、秒で構成された小数点以下の値を使わない整数で表されている上、
基準日時が通常端末とは異なる1970/01/01と云う仕様。
・・・Longで表されるシリアル値で、且つ 1900/01/01を基準として動作するVBScriptの日付関数では、
単純に そのまま代入して使うと云うワケには逝かなかった。
今回は、それらの点への対応と、オブジェクトの再利用など、処理の流れを大幅に見直し効率化を図り、且つ
暫定ではあるが、複数ファイルドロップも可能にした。
・・・ただ、カメラの設定項目で、SIGMA PhotoProでも抽出でき、撮影データと深く関わりのある、
露出補正/コントラスト/彩度/シャープネス は、あれらテキストとは、独立したBitで記録されているらしく、
今回の版でも取り出せてない。
そのヘン、X3Fファイルのデータ形式について物色したら、意外に単純でない項目があって、
仕様の通りの処理していては、ファイルの全領域を読み込む必要性に迫られてしまう・・・
コレは、ネットワークドライブを多用している おきつねさま的には、非常~にヨロしくない(´ヘ`;)
なので、実機サンプル撮影後のデータを比較解析し、詳細が判明し次第、スクリプトに反映させるコトとした。
ま、今回のでも、前の版よりは、全然マシではあるモノの、以下は やっぱり、
まだまだ アクマでサンプルですから・・・m(_ _)mスクリプトは、散々コソコソ差し替えつつも、何気にメドイさんだったんで
アーカイブせずに放置していたのだが、取り敢えず、うpしますたm(_ _)m
▲ を、右クリックしてファイルとして保存してください。晒し者w
Option Explicit Public My, Parameters, Fs, objADO Set My = WScript With My Set Parameters = .Arguments If Parameters.Count <= 0 Then .Quit End If Set Fs = .CreateObject("Scripting.FileSystemObject") Set objADO = .CreateObject("ADODB.Stream") End With Const vbWq = """" Dim vbWCrLf, vbTc, vbNullB vbWCrLf = vbCrLf & vbCrLf vbTc = vbTab & vbCrLf vbNullB = chr(&h00) Dim X3FSet X3FSet = Array("X3F",, 0, 1764, "VERSION_BF", "BURST", "TIME", "1970/1/1") BPS Parameters, X3FSet Set Fs = Nothing Set objADO = Nothing My.Quit Function BPS(arFileNames, arSet) Dim kNothing, iADO, strTarget, Pc, fKey, rSource Dim lHeader, pResult, arResult, rUnits, sResult kNothing = String(5, vbNullB) Set iADO = objADO For Each strTarget In arFileNames If Fs.GetExtensionName(strtarget) = arSet(0) Then arSet(1) = Replace(strtarget,"." & arSet(0),".txt") With iADO .Type = 1 .Open .LoadFromFile strTarget .Position = arSet(2) rSource = .Read(arSet(3)) If .Position > 0 Then .Close rSource = CStr(rSource) rSource = Replace(rSource, kNothing, "") .Type = 2 .Charset = "_autodetect" .Open .Position = 0 .WriteText = rSource lHeader = .Position rSource = "" For Pc = 0 To lHeader .Position = Pc pResult = pResult & .ReadText(1) Next .Close arResult = Split(pResult, vbNullB) pResult = "" For Each sResult In arResult If sResult = arSet(4) Or fKey > 0 Then If fKey = 4 Then sResult = cnvDateTime(arSet(7), sResult) End If rUnits = rUnits & sResult If fKey < 2 Then If sResult = arSet(5) Then fKey = 5 ElseIf sResult = arSet(6) Then fKey = 4 Else fKey = 3 End If rUnits = rUnits & "," Else rUnits = rUnits & vbCrLf If fKey = 5 Then Exit For End If fKey = 1 End If End If sResult = "" Next arResult = "" fKey = 0 .Type = 2 .Charset = "_autodetect" .Open .Position = 0 .WriteText rUnits .SaveToFile arSet(1), 2 End If .Close End With rUnits = "" End If Next Set iADO = Nothing End Function Function cnvDateTime(strBaseDate, SourceDateTime) Dim sDate sDate = DateValue(strBaseDate) cnvDateTime = (((SourceDateTime / 60) / 60) / 24) + sDate End Function
|
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。