[ 新規に投稿する ]

JPEGのEXIFをダイアログボックスで表示No.08833
らる さん 20/09/24 01:18 [ コメントを投稿する ]
  続けての質問すみません。

JPEGのEXIFを見るときはいつも右クリックをしてプロパティから見ています。

スクリプトをツールバーに登録して選択したJPEGのEXIFをダイアログボックスで表示するスクリプトは実現可能でしょうか?

[ ]
RE:08833 JPEGのEXIFをダイアログボックスで表示No.08834
秀丸担当 さん 20/09/24 10:15 [ コメントを投稿する ]
 
秀丸ファイラーClassicの機能としては、Exif情報を取り出す機能そのものは無いです。

スクリプトでは、既に詳細表示に表示されているとき、GetItemTextメソッドで取得する方法があります。
(ヘルプのスクリプトの例の「詳細表示をTSV化してクリップボードにコピー」が参考)

「名前の変更(一括)」のダイアログでは「*<撮影日時>」のようにして取り出す方法があります。

これと同じように、詳細表示に無くて、単純にスクリプトであるプロパティの情報を取り出すとしたら、秀丸ファイラーClassicの機能としうわけではないですが、WSHで使われるのと同じような方法が使えます。
以下はWeb検索してWSHでExifとかを参考にして、撮影日時を出すようにしてみた例です。
秀丸ファイラーClassic独自のこととしては、選択されたファイル名を得るためにGetNextItem(-1,2)やGetItemPath(iItem)を使っているだけになります。

//「js:C:\folder\test.js」のようにしてブックマークに登録
iItem=GetNextItem(-1,2);
if(iItem>=0){
    objFso = new ActiveXObject("Scripting.FileSystemObject");
    strBase = objFso.GetFileName(GetItemPath(iItem))
    objShell = new ActiveXObject("Shell.Application");
    objFolder = objShell.NameSpace(GetDirectory());
    objItem = objFolder.ParseName(strBase);
    for(i=0;i<1000;i++){
        if(objFolder.GetDetailsOf("",i)=="撮影日時" ) {
            Message(objFolder.GetDetailsOf(objItem,i) );
            break;
        }
    }
}

 
[ ]
RE:08834 JPEGのEXIFをダイアログボックスで表示No.08835
らる さん 20/09/24 11:03 [ コメントを投稿する ]
  すみません、WSHとかプログラム的なことはよく分からなく
ただexifなどメタデータを拾得して情報を別ウィンドウに出力するだけなら
スクリプトというか秀丸エディタで言うマクロでも可能なのかと思い質問してみました。
Chromeのアドレスバーにjavascript:alert(document.lastModified);と打つと
webページの最終更新日時が別ウィンドウで表示されるのを見て構想しました。

秀丸ファイラー本体に機能追加しないとできないほどプログラム的に難しいんですか?
利用想定としてはデジカメで撮った写真のISO感度とかシャッタースピードとか
少ないステップで確認するためです。
詳細表示ならソートに登録すればすぐに分かるんですが画像がアイコンになってしまうので。
一番理想としてはプレビュー枠の余白に任意のメタデータを表示できたら
一番なんですが。
[ ]
RE:08835 JPEGのEXIFをダイアログボックスで表示No.08836
秀丸担当 さん 20/09/24 13:38 [ コメントを投稿する ]
 
他のプロパティも表示するとしたら以下のような感じになります。

s="";
iItem=GetNextItem(-1,2);
if(iItem>=0){
    objFso = new ActiveXObject("Scripting.FileSystemObject");
    strBase = objFso.GetFileName(GetItemPath(iItem))
    objShell = new ActiveXObject("Shell.Application");
    objFolder = objShell.NameSpace(GetDirectory());
    objItem = objFolder.ParseName(strBase);
    for(i=0;i<1000;i++){
        propname=objFolder.GetDetailsOf("",i);
        if(propname=="撮影日時"
         ||propname=="ISO 速度"
         ||propname=="露出時間"
         ) {
            s=s+propname+" : "+objFolder.GetDetailsOf(objItem,i)+"\n";
        }
    }
}
Message(s);
 

スクリプトに新しいメソッドを追加したら、もう少し簡略に書けるかもしれません。
例えば仮にGetPropertyというメソッドを追加したとして、以下のようにできるとか。
Message( GetProperty(GetItemPath(iItem),"撮影日時") );
とはいえ一行で書けるわけではないので、上記スクリプトと大差ないかもしれないです。

詳細表示じゃないときでも表示するとしたら、レジストリをいじってエクスプローラとも共通のステータスバーに表示する情報を変える方法も考えれますが、これをいじるのは難しいと思います。
参考までに、HKEY_CLASSES_ROOTの配下にある拡張子に対応するInfoTipというところの情報を変えるとできたりするようです。
[ ]
RE:08836 JPEGのEXIFをダイアログボックスで表示No.08837
らる さん 20/09/24 14:22 [ コメントを投稿する ]
  上記のスクリプトをtest.jsという名前でファイルを作り
ツールの整理からスクリプトを参照でtest.jsを登録して任意のjpegを選択して
スクリプトを実行したらエラーが表示されました


エラー内容は

終了していない文字列型の定数です。
行番号:11
エラーコード:0/0 0x800a03f7

ブックマークに整理から同じ手順で登録しましたが同じエラーが出ました。

[ ]
RE:08837 JPEGのEXIFをダイアログボックスで表示No.08838
秀丸担当 さん 20/09/24 14:38 [ コメントを投稿する ]
 
日本語の部分の行のエラーで、おそらくテキストファイルをUnicode(UTF-8)のBOMなしで保存されているためだと思います。
Unicode(UTF-16)のBOMありで保存すると確実です。
またはShift-JISでもいいです。

UTF-8のBOMありは対応していなかったので、対応を検討しようと思います。UTF-8のBOMありの場合は現状だと一行目でエラーになります。
UTF-8のBOMなしは解析して判定する必要があって、UTF-8のBOMなしの対応はやめておこうと思います。
[ ]
RE:08838 JPEGのEXIFをダイアログボックスで表示No.08839
らる さん 20/09/24 15:03 [ コメントを投稿する ]
  確認したとこたしかにUTF-8のBOMなしでshift-jisで保存したところ正常にスクリプトが動作しました。
まさに望んだ通りの動作でおかげで確認作業が楽になりました。
ありがとうございました。

UTF-8のBOMなしが一番無難でトラブルが少ないと思ってデフォルトにしてたんですが文字エンコードが原因とはびっくりしました。
[ ]

[ 新規に投稿する ]