カメラの撮影日時を秒まで取得

解決


よしお  2007-11-18 19:25:59  No: 138159  IP: 192.*.*.*

VB6+XP
EXIF情報の取得は規格の不統一などでかなり面倒のようなので下記のようなもので撮影日時を取得しようとしました。これで撮影日時は取れるのですが時間が分までしか出ません。秒まで欲しいのですが方法があったら教えてください。

Private Sub Command1_Click()

    Dim WSHShell   As Object
    Dim WSHFolder  As Object
    Dim FolderName As Variant
    Dim PicDate As Variant
    
    FolderName = "d:\画像\2007_8"
    Set WSHShell = CreateObject("Shell.Application")
    'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
    Set WSHFolder = WSHShell.NameSpace(FolderName)
    
    PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 25)
    
MsgBox(PicDate)

End Sub

編集 削除
Nov  2007-11-18 21:45:56  No: 138160  IP: 192.*.*.*

PicDate = の右端の25を変えたらどうなるかを2,3試したところ
色々な情報が出てくるようです。

そこで試しに下記のような事をして見ました。
その結果では31にすると下記の様に秒まで出て来るようですが如何?
2007:03:17 09:45:59


Private Sub Command1_Click()

    Dim WSHShell   As Object
    Dim WSHFolder  As Object
    Dim FolderName As Variant
    Dim PicDate As Variant
    Dim i As Long
    
    Open "c:\info.txt" For Output As #1
    FolderName = "C:\Canon"
    Set WSHShell = CreateObject("Shell.Application")
    'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
    Set WSHFolder = WSHShell.NameSpace(FolderName)
    
    'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 27) 'ピクセル
    'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 26) 'size
    'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 25) '写真の撮影日
    
    'MsgBox (PicDate)

     For i = 0 To 40
        PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), i) '
        Print #1, CStr(i) & " : " & PicDate
    Next i

    Close #1
    
    Label1.Caption = "終  了"
    
End Sub

編集 削除
よしお  2007-11-19 10:32:40  No: 138161  IP: 192.*.*.*

Nov様、できました。本当にありがとうございました。
いろいろ試しましたが"31"が出ないファイルもありますので下記のようにして処理することにしました。ご親切、御礼申し上げます。

Private Sub Command1_Click()

    Dim WSHShell   As Object
    Dim WSHFolder  As Object
    Dim FolderName As Variant
    Dim PicDate As Variant

    Dim PicDate25 As Variant
    Dim PicDate31 As Variant

    
    FolderName = "d:\画像\2007_8"
    Set WSHShell = CreateObject("Shell.Application")
    'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
    Set WSHFolder = WSHShell.NameSpace(FolderName)
    
    PicDate25 = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 25)

    PicDate31 = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 31)

if PicDate31><"" then
    PicDate=PicDate31
Else
    PicDate=Format(PicDate25, "yyyy/mm/dd hh:mm:ss")
end if

MsgBox(PicDate)

End Sub

編集 削除
魔界の仮面弁士  2007-11-19 11:13:24  No: 138162  IP: 192.*.*.*

# 本題とは関係ないところに反応。

>    Set WSHShell = CreateObject("Shell.Application")
イコールの左辺(変数名)と右辺が合っていないようです。

ProgID "Shell.Application" で得られるのは、Shell オブジェクトです。
WshShell オブジェクトならば、ProgID は "WScript.Shell" ですね。

編集 削除
よしお  2007-11-19 16:21:42  No: 138163  IP: 192.*.*.*

魔界の仮面弁士様、回答をありがとうございます。

WScript.Shellを試すために参照設定しようと調べましたがこれにはWindows Scripting Host Runtime Libraryが必要のようです。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/wshshell.htm
VB6で探しましたがこれに相当するライブラリが見当たりませんがこのような場合はどのようにすれば宜しいでしょうか?

また当初の目的である撮影日時(秒まで)の取得にはどのような方法があるのか、簡単にできるものがあればご指導ください。

編集 削除
魔界の仮面弁士  2007-11-20 03:59:27  No: 138164  IP: 192.*.*.*

> WScript.Shellを試すために
今回の目的であれば、WshShell を試す必要は無い気がします。(^^;

> これに相当するライブラリが見当たりませんが
ProgId が分かっている場合は、そこから逆引きできる場合があります。
たとえば、WScript.Shell の場合、レジストリから
  HKEY_CLASSES_ROOT\WScript.Shell\CLSID
のキーを見ると、そこから
  {72C24DD5-D70A-438B-8A42-98424B88AFB8}
という値を得る事ができます。後はその値を元に、
  HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}
の下のキーを見ていけば、
  C:\WINDOWS\System32\wshom.ocx
というファイル名を発見できるかと。

あとはそれを参照設定すれば、
  Dim a As IWshRuntimeLibrary.WshShell
  Set a = New IWshRuntimeLibrary.WshShell
  Dim b As Object
  Set b = CreateObject("WScript.Shell")
といったコードを得られます。


ちなみに、(WshShell ではなく)Shell オブジェクトの方は、
参照設定するのは Shell32.DLL です。
(Win98 などの古い OS の場合は、別のファイル名になっていますが)

  Dim c As Shell32.Shell
  Set c = New Shell32.Shell
  Dim d As Object
  Set d = CreateObject("Shell.Application")


> また当初の目的である撮影日時(秒まで)の取得にはどのような方法があるのか、
私の知っているのは、GDI+ の API を使って、&H9003 のプロパティID から、
"2003-08-03_14-46-50" のような形式で、撮影日時を得る方法ぐらいです。
http://www.atmarkit.co.jp/fdotnet/dotnettips/047exif/exif.html

> 簡単にできるものがあればご指導ください。
う〜ん。.NET なら bitmap.PropertyIdList 経由で簡単に得られるのですが、
GDI+ の Flat API を使うとなると、幾つかの Declare 宣言が必要なので
ちょっと面倒かも。

編集 削除
魔界の仮面弁士  2007-11-20 04:37:02  No: 138165  IP: 192.*.*.*

> 私の知っているのは、GDI+ の API を使って、&H9003 のプロパティID から、
> "2003-08-03_14-46-50" のような形式で、撮影日時を得る方法ぐらいです。

GDI+ を使って、プロパティID を得る例。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200709/07090026.txt

サンプルで読み取っているのは、&H9003 (ASCII, 20) のプロパティではなく、
&H5100 (Long), &H5101 (Short, 1) の例なので、微妙に異なりますけれどね。

編集 削除
よしお  2007-11-20 11:34:30  No: 138166  IP: 192.*.*.*

魔界の仮面弁士様  大変詳細な解説をありがとうございます。
>今回の目的であれば、WshShell を試す必要は無い気がします。(^^;
あえてWshShellを使わなくても今回の目的には前回方式でとりあえずOKと判断し解決のチェックを入れさせていただきました。

ランタイムライブラリを探す方法、設定の方法など今後色々と役立つものと思います。あらためてお礼申し上げます。

編集 削除