お世話になります。 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;
> なおD6pでExifの扱いができるものがありましたらそれも試してみたい
http://fow.minim.ne.jp/
ここの ExifInfo Ansi版 はどうでしょうか。
Nov様 情報をありがとうございます。
今サイトを開いてDLしてみましたが対応言語がBorland Delphi 2010/2009 (Win32のみ)とありました。当方のはD6パーソナルです。 Delphiはバージョンによる互換性に問題があるように聞いていますが大丈夫でしょうか? とはいえやってみなければわかりませんのでバラックでテストしてみたいと思います。 ありがとうございました。
たぶん、Unicode版をダウンロードされているようなので、念のため。
試してませんが、Ansi版(D2007以下用)もあるはずです。
おっと、良く見たらD7からでした。D6には対応してないかもですね。
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' ユニットはコンパイルできませんでした
Nov様。投稿が前後してしまったようで失礼しました。D7からのものもあるようですがD6はないのかもしれません。バージョン間の互換性にやはり問題があったようです。
残念、だめでしたか... 役に立てず申し訳ありません。
一応下記サイトにExif情報を扱う記事が書かれています。
2007年の記事なので、まんまD6に通用するかは疑問ですが、参考まで。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080313/296189/?ST=develop&mkjt&P=1
(注:無料の登録が必要です)
Nov様 各種の情報をいただきありがとうございます。ご紹介の記事を(登録不要箇所のみ)見ましたが、そもそも論からの解説記事なので恐らく実用にするまでには多大な知識と時間が掛かりそうでした。
そんな折、VB6でExif読み込みのソースコードを見つけました。テストしてみましたがわずか数分で撮影日時取得ができました。
http://sourceforge.net/projects/exifclass/files/
VB製のDLLをDelphiで使うなどというのが可能であれば使用してみたいと思います。(もしもこれに関するノウハウをお持ちでしたら教えてください)
紹介されている 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;
D6持ってないのでフォロー出来ませんが。
その一箇所というのを教えてもらえはしないでしょうかね?
手馴れた人ならすぐ分かる箇所でも人によっては相当大変な作業だったりしますので。
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で置き換える必要があると思いますのでただ消しただけでは心配です。とても理解できるレベルにありませんのでご教示のほどよろしくお願いします。
とりあえずは何とかデータが取れてやれやれという感じです。ありがとうございました。
グローバル、または'MzFileUtils.pas'ユニット内のどこからでも参照できる位置に、以下の 1行を追加するだけよ。
resourcestring SFOpenErrorEx = 'Cannot open file "%s": %s';
修正するのは様
コメントアウトした行を生かしてから追加すべき1行をいろいろ位置を変えて入れてみましたら(90行に入れて)やっと通りました。
いろいろとご教示いただきました皆様にお礼申し上げます。
解決チェック後の追加質問で申し訳ありません。
ExifInfoはとりあえず動いたと思っていたのですが正しく使いこなすためにHELPを見て勉強する必要が出てきました。 どうしてもHELPの出し方がわからないので教えてください。
今の問題は画像ファイルを整理するためにフォルダーごとバッチ処理で撮影時刻などを一括処理する際に「ExifまたはDCF形式ではありません」などと止まってしまうのを回避させる手段を探しております。 HELPは以前どこかで見たような気がしたのですが・・・ よろしくお願いします。
ヘルプは、作者ホームページからダウンロードできます。
Win7では開けませんでした(XPmodeはOKでした)。
あと、ここでの質問を否定するつもりはありませんが、その手の質問は作者さまに質問したほうが、より適切なアドバイスを頂けるのでは、と思います。
Nov様 早速HELPをDLしてみました。実に美しくまとめられたものとその完成度には驚きましたが内容は使い方の説明ではなくて仕様書風で私のレベル的には理解困難でした。Einfoという実際の使用例のあるソースコードを見つけて各種の画像ファイルで試しましたがやはり各種のエラーメッセージで止まりました。エラーがなければ答えを返してくれ、エラーなどあったら無回答、もしくはエラーコードを返してくれる(止まらない)というような使い方をしたいという単純なものですので作者さまに直接お聞きするのも恐れ多いとは思いますがやってみます。ありがとうございました。
ツイート | ![]() |