-公開ソフト&物 へ移動 --

■開発にて
●Exifの情報の保護
 開発の目的は、「改ざんの形跡を残さないよう日時を変える」です。
 最初は単純に、@ITで紹介されている方法Bitmapクラスで、Exifの情報を取得し日時を変更したのですが、保存の際にファイル形式がインテル形式に変わり、Exifの情報が一部喪失したので、結局Exifのタグを解析する羽目になりました、あるサイトのPerlで書かれていた内容をC#に写しました。

●ファイルプロパティの概要・ 詳細の編集 -序章-
 「日時の変更だけでは能が無い」と「おまけ」でファイルプロパティ編集機能を追加したのですが、Vista対応で3回失敗しました。(ノД`)
 ファイルプロパティは、マイクロソフトから配布されているOffice用「dsofile.dll」を使い、WindowsXPでは完璧に動作したのですが、64bitOSのVistaで「dsofile.dl」が動かない、コンパイル方法をAryCPUからx86にしたらOKでした、32bitDLLは64bitアプリケーションで動かせないんですね。


コンパイル選択画面

 次に、当アプリで必要なDLLを実行ファイルと同一フォルダに置いても動かない、調べるとコンパイルすると生成されるInterop.〜.dllや〜.manifestが実行ファイルと同一フォルダに必要。


コンパイルで生成されるファイル

 ようやく動作を確認し公開直前と思いきや、VistaでWindowsエクスプローラからプロパティの詳細を編集すると、当ソフトとVistaで編集した内容が異なる。


vista編集イメージ 

 Bitmapクラスで試してみましたが・・・同様。
 NTSFストリームに書き込んでるのかな?と勘違したりして、ファイルの中身を見てみました。 


JPGファイルに書き込まれている内容

 Adobe仕様「XMP」が書かれています、バイナリエディタで編集したら、Vistaのファイル詳細情報もその通り表示されましたが、1文字消すとエラー?になり、今度は「XMP」の内容ではなく「Exif」の内容がVistaのファイル詳細情報で表示されました、簡単ではないようです。
 
 編集方法を模索した結果、.NET Framework 3.0でJPGのXMPメタデータを表示方法を紹介してブログを見つけたました。

●.NET Framework 3.0 開発環境構築
 当方は、VS2005なのでマイクロソフトのMSDNの手順より.NET Framework 3.0 環境構築する。
 マイクロソフトより「Visual Studio 2005 Extensions for Windows Workflow Foundation (JA).exe」をダウンロードして実行したら、仮想PCソフト「Virtual PC 2007」のセットアップメニューが?酷いバグ?だ〜、再起動して再び実行、今度は無事動いたがインストール開始前に「Windows Workflow Foundation version 3.0.4203.2」がないって怒られた?Vistaなので.NET Framework 3.0は入っているはず・・・ 
 Vistaの「機能の有効化または無効化」を思い出し、.NET3.0があったのでチェックを全て入れてたら、インストールに成功した。


Vistaの「Windowsの機能の有効化または無効化」

●ファイルプロパティの概要・ 詳細の編集 Vista対応
 メタデータの取得に成功しました、デバックすると中はこんな感じです。

 試しにAdobe製品でタイトル等を書き込んだJPGファイルを読んでみたらちゃんと表示されました。
 Author,keywordsの「Count=1」は複数書き込むAdobe製品に合わせてあるよです、Adobe製品で複数書き込むと複数表示されました、当ソフトもAdobe製品に合わせて「;」区切りで複数に対応しました。

 次は編集です、海外のサイトで公開されているソースを元にInPlaceBitmapMetadataWriterクラスで、データ変更出来ましたが・・・新規にタイトルなどの項目を追加すると保存で失敗。
 また見つけた方法を上書き保存出来るようにして、Vistaでの書き込みに成功しました、がファイルサイズが大幅に変わる〜、大きくなったり小さくなったり、試しにBitmapCacheOption.Noneに設定して実行、するとサイズが変わらなくなりました。
 
 どっか間違ってるかもしれませんがソースを乗せておきます、WindowsBasePresentationCoreに参照設定が必要です。
using System.IO;
using System.Windows.Media.Imaging;

string FileName = "test.jpg"

using (MemoryStream JpegStreamIn = new MemoryStream(File.ReadAllBytes(FileName)))
{

    JpegBitmapDecoder JpegDecoder = new JpegBitmapDecoder(JpegStreamIn,
    BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);//Defaultだとサイズが変わる

    using (FileStream JpegStreamOut = File.Open(FileName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
    {

        JpegBitmapEncoder JpegEncoder = new JpegBitmapEncoder();

        BitmapFrame JpegFrame = BitmapFrame.Create(JpegDecoder.Frames[0]);
        JpegEncoder.Frames.Add(JpegFrame);
        BitmapMetadata JpegMeta = (BitmapMetadata)JpegFrame.Metadata;

        pegMeta.Title = "タイトル";

        JpegEncoder.Frames.Add(BitmapFrame.Create(JpegFrame, null, JpegMeta, null));
        JpegEncoder.Save(JpegStreamOut);
    }
}
 保存すると元データとは構造が変わります、BitmapクラスではExifのメーカーノートの位置を見失い?ましたが、上記の方法ですと表示されました。

 ・・・が今度はVistaとXPで互換性が無くなってしまった。
:読込み
:書込み :タグ以外
青破線:XMPが無い・正常でない場合はExifから読込み

Vistaで編集後にXPで編集すると、XPとVistaで違う内容のプロパティが表示されます。.
VistaではXMPを、XPではExifを見ている。
 JPGファイルプロパティの読み書き OSによる違い(想像図)

 仕方が無いのでWindows5を境にBitmapクラスと上記のJpegBitmap〜の方法で処理方法を分けることに、なんとも面倒な作りです。
 
 当ソフトもWindowa5(XP)以降で、Vista方式で書込み後、OSで項目を変更すると、XPとVistaで違う内容のプロパティが表示されます。

 Bitmapクラスで保存するたびに、FFFEのJPGコメントの内容を、Exifの0x9286タグを新しく作り保存してくれます、保存を繰り返すと0x9286タグが沢山出来てしまいます。
 当ソフトはBitmapクラスで保存するとき0x9286を見つけたら削除します。
 
■終わりに
 C#とVBAは他のサイトで紹介されている内容をコピペしました。(コピペじゃ実力付かないな〜)
 dllの使い方など、当方の未熟さを痛感します、ソースコードをコピーさせて頂きました皆様方、ありがとう御座います。
 
 CSVファイル経由だけでなく「GUI編集画面も」と思いましたが、Excelの操作性・拡張性を考えると作る気になれませんでした。
 「Excelサンプル.xls」でサムネールを大きくすると編集しにくいのが難点です。(入力フォームがあると良いかもしれません、親切な方が作ってくれないかな〜)
■作成したきっかけ
 あるデータに、JPGファイルを付ける必要があったのですが、データ内容と撮影日時に整合性がなく、日時を変更するフリーソフトで全ての撮影日時を同一にし、「デジカメの時計を設定してない」と言う事にしておりました。(実際には設定なしは出来ませんでしたが・・・) 
 JPGファイルを数百枚扱うこともあったので、1枚ずつ日時を合わせてはいられなかったんです。
 その時、ExcelでRAND()関数などを使い、編集出来たら楽なの-、出来れば項目毎にリネームできればな〜と思ったのがきっかけです。
 -公開ソフト&物 へ移動 --
inserted by FC2 system