Win7で撮影日時取得

解決


mizuki  2012-03-26 20:26:07  No: 41828

お世話になります。  XP+D6pでやっていますがWin7対策が必要となりました。カメラ画像の撮影日時を取得するために従来はXPで下記のようにしておりましたがWin7(64)では日時の取得ができないことがわかりました。試しにGetDetailsOfの番号(25,31)を可変にしてWin7で試したところ、特に秒まで出ている項目はありませんでした。Win7でもエクスプローラで画像ファイルにマウスを当てると撮影日時(分まで)が出るのを見るとWin7でも何か策があるのではないかと思い質問させていただきました。

なおD6pでExifの扱いができるものがありましたらそれも試してみたいと思いますのでよろしくお願いします。

procedure GetPicDT(PicFile:string);
var
    Shell: OleVariant;
    Folder: OleVariant;
    i,p: Integer;
    FolderItem: OleVariant;
    filepath,filename:string;
begin
  FilePath := ExtractFileDir(picfile);
  FileName := ExtractFileName(picfile);
  shell := CreateOleObject('Shell.Application');
  Folder := Shell.NameSpace(OleVariant(FilePath));
  FolderItem := Folder.ParseName(FileName);
  
  picHM_:=vartostr(Folder.GetDetailsOf(FolderItem, 25));  //時分
  picHMS:=vartostr(Folder.GetDetailsOf(FolderItem, 31));  //時分秒

  //  解放
    FolderItem  := Unassigned;
    Folder      := Unassigned;
    Shell       := Unassigned;

end;


Nov  2012-03-27 02:31:20  No: 41829

> なおD6pでExifの扱いができるものがありましたらそれも試してみたい
http://fow.minim.ne.jp/
ここの ExifInfo Ansi版 はどうでしょうか。


mizuki  2012-03-27 03:11:14  No: 41830

Nov様  情報をありがとうございます。
今サイトを開いてDLしてみましたが対応言語がBorland Delphi 2010/2009 (Win32のみ)とありました。当方のはD6パーソナルです。  Delphiはバージョンによる互換性に問題があるように聞いていますが大丈夫でしょうか?  とはいえやってみなければわかりませんのでバラックでテストしてみたいと思います。  ありがとうございました。


Nov  2012-03-27 03:30:54  No: 41831

たぶん、Unicode版をダウンロードされているようなので、念のため。
試してませんが、Ansi版(D2007以下用)もあるはずです。


Nov  2012-03-27 03:39:53  No: 41832

おっと、良く見たらD7からでした。D6には対応してないかもですね。


mizuki  2012-03-27 03:43:12  No: 41833

Nov様  Libフォルダーにコピーして試したところ下記のようなエラーが出ました。  これはバージョンの問題でしょうか?

警告] Unit1.pas(7): ユニット 'ShellCtrls' はプラットフォームに依存すると宣言されています
[エラー] ExifInfo.pas(8): 間違ったコンパイル指令 : 'IMPLICIT_STRING_CAST'
[エラー] ExifInfo.pas(9): 間違ったコンパイル指令 : 'IMPLICIT_STRING_CAST_LOSS'
[エラー] ExifInfo.pas(991): 未定義の識別子 : 'RawByteString'
[エラー] ExifInfo.pas(1031): '=' が必要な場所に ':' があります
[エラー] ExifInfo.pas(1031): ';' が必要な場所に '(' があります
[エラー] ExifInfo.pas(1034): 未定義の識別子 : 'TBytes'
[エラー] ExifInfo.pas(1039): 互換性の無い型です
[エラー] ExifInfo.pas(1040): 互換性の無い型です
[エラー] ExifInfo.pas(1212): 未定義の識別子 : 'TBytes'
[エラー] ExifInfo.pas(1214): 未定義の識別子 : 'RawByteString'
[エラー] ExifInfo.pas(1217): 未定義の識別子 : 'SetCodePage'
[エラー] ExifInfo.pas(1218): 未定義の識別子 : 'BytesOf'
[エラー] ExifInfo.pas(1219): 互換性の無い型です
[エラー] ExifInfo.pas(4938): 未定義の識別子 : 'AnsiStrAlloc'
[エラー] ExifInfo.pas(5005): 未定義の識別子 : 'AnsiStrAlloc'
[エラー] ExifInfo.pas(5309): 未定義の識別子 : 'AnsiStrAlloc'
[エラー] ExifInfo.pas(5509): 未定義の識別子 : 'RawByteString'
[エラー] ExifInfo.pas(5525): 互換性の無い型です
[致命的エラー] Unit1.pas(7): 'ExifInfo.pas' ユニットはコンパイルできませんでした


mizuki  2012-03-27 03:48:59  No: 41834

Nov様。投稿が前後してしまったようで失礼しました。D7からのものもあるようですがD6はないのかもしれません。バージョン間の互換性にやはり問題があったようです。


Nov  2012-03-27 08:34:58  No: 41835

残念、だめでしたか...  役に立てず申し訳ありません。
一応下記サイトにExif情報を扱う記事が書かれています。
2007年の記事なので、まんまD6に通用するかは疑問ですが、参考まで。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080313/296189/?ST=develop&mkjt&P=1
(注:無料の登録が必要です)


mizuki  2012-03-27 21:27:50  No: 41836

Nov様  各種の情報をいただきありがとうございます。ご紹介の記事を(登録不要箇所のみ)見ましたが、そもそも論からの解説記事なので恐らく実用にするまでには多大な知識と時間が掛かりそうでした。

そんな折、VB6でExif読み込みのソースコードを見つけました。テストしてみましたがわずか数分で撮影日時取得ができました。
http://sourceforge.net/projects/exifclass/files/
VB製のDLLをDelphiで使うなどというのが可能であれば使用してみたいと思います。(もしもこれに関するノウハウをお持ちでしたら教えてください)


ExifInfo Ansi版なら  2012-03-27 21:42:34  No: 41837

紹介されている ExifInfo Ansi版を使えば ソースを1か所修正するだけで
D6 personal でもコンポのコンパイル、インストールが可能。
WinXPなら以下のコードでExif情報が表示できるけど、Win7でも出来るか
どうかは不明。 出来たら報告してね。

 with ExifInfo1, TOpenPictureDialog.Create(Self) do try
  if Execute then begin
   if not IsExif(FileName) then begin
    ShowMessage('この画像には Exif情報はありません');
    exit;
   end;
   ImageFileName := FileName;
   Memo1.Lines.Add(DateTimeText);
   Memo1.Lines.Add(DateTimeDigitizedText);
   Memo1.Lines.Add(DateTimeOriginalText);
   Memo1.Lines.Add(Model);
   ShowMessage('この画像の撮影日時は '+ DateTimeOriginalText +' です');
  end;
 finally
  Free;
 end;


monaa  2012-03-27 22:02:44  No: 41838

D6持ってないのでフォロー出来ませんが。
その一箇所というのを教えてもらえはしないでしょうかね?
手馴れた人ならすぐ分かる箇所でも人によっては相当大変な作業だったりしますので。


mizuki  2012-03-27 22:39:08  No: 41839

Nov様  ごめんなさい。エラーが多発したのはUnicode版だったかもしれません。
ExifInfo Ansi版なら様:  Ansi版をDLしてやってみましたら次のようなエラーが出ましたので強引にエラー箇所をコメントアウトにしてやってみたところWin7(64)でも取得できました。

出たエラーは
[エラー] MzFileUtils.pas(143): 未定義の識別子 : 'SFOpenErrorEx'
[致命的エラー] ExifInfo.pas(833): 'MzFileUtils.pas' ユニットはコンパイルできませんでした

コメントアウトしたコード  
//raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(AFileName),
        //      SysErrorMessage(GetLastError)]);

はMzFileUtilsの143,150,160,167行の4箇所で使われています。
です。本来この箇所の機能をD6で置き換える必要があると思いますのでただ消しただけでは心配です。とても理解できるレベルにありませんのでご教示のほどよろしくお願いします。

とりあえずは何とかデータが取れてやれやれという感じです。ありがとうございました。


修正するのは  2012-03-27 23:12:30  No: 41840

グローバル、または'MzFileUtils.pas'ユニット内のどこからでも参照できる位置に、以下の 1行を追加するだけよ。

resourcestring SFOpenErrorEx = 'Cannot open file "%s": %s';


mizuki  2012-03-28 00:05:30  No: 41841

修正するのは様    
コメントアウトした行を生かしてから追加すべき1行をいろいろ位置を変えて入れてみましたら(90行に入れて)やっと通りました。
いろいろとご教示いただきました皆様にお礼申し上げます。


mizuki  2012-03-28 20:39:52  No: 41842

解決チェック後の追加質問で申し訳ありません。
ExifInfoはとりあえず動いたと思っていたのですが正しく使いこなすためにHELPを見て勉強する必要が出てきました。  どうしてもHELPの出し方がわからないので教えてください。
今の問題は画像ファイルを整理するためにフォルダーごとバッチ処理で撮影時刻などを一括処理する際に「ExifまたはDCF形式ではありません」などと止まってしまうのを回避させる手段を探しております。  HELPは以前どこかで見たような気がしたのですが・・・  よろしくお願いします。


Nov  2012-03-28 20:58:21  No: 41843

ヘルプは、作者ホームページからダウンロードできます。
Win7では開けませんでした(XPmodeはOKでした)。
あと、ここでの質問を否定するつもりはありませんが、その手の質問は作者さまに質問したほうが、より適切なアドバイスを頂けるのでは、と思います。


mizuki  2012-03-29 00:02:57  No: 41844

Nov様  早速HELPをDLしてみました。実に美しくまとめられたものとその完成度には驚きましたが内容は使い方の説明ではなくて仕様書風で私のレベル的には理解困難でした。Einfoという実際の使用例のあるソースコードを見つけて各種の画像ファイルで試しましたがやはり各種のエラーメッセージで止まりました。エラーがなければ答えを返してくれ、エラーなどあったら無回答、もしくはエラーコードを返してくれる(止まらない)というような使い方をしたいという単純なものですので作者さまに直接お聞きするのも恐れ多いとは思いますがやってみます。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加