QA@IT

画像ファイル(JPG)のコメント取得について

4788 PV

OS:Windows7
言語:C#

JPGファイルのプロパティ →「詳細」タブ →"コメント"
に任意で文字を入力して保存。
プログラムで、指定した文字の入っているJPGファイルを
取得すりるために、"コメント"に入力された文字を取得
したいのですが、うまくとれません。

いろいろな書き込みやサイトに記述されているのを参考に
タイトルは取得できましたが、コメントは取得できません。

参考にしたPGを載せます。

//画像を読み込む
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(@"D:\TEST.jpg");

int[] pils = bmp.PropertyIdList;
int index = Array.IndexOf(pils, 0x9286);
if (index == -1)
{
Console.WriteLine("ユーザーコメントが含まれていません。");
return;
}

if (bmp.PropertyItems == null || bmp.PropertyItems.Length == 0) { return; }

//PropertyItemオブジェクトを取得する
System.Drawing.Imaging.PropertyItem pi = bmp.PropertyItems[0];

//Exif情報を列挙する
foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems)
{
//タグIDが"ユーザーコメント"の場合は、
if (item.Id == 37510)
{
//データの型を判断
if (item.Type == 2)
{
//ASCII文字の場合は、文字列に変換する
string val = System.Text.Encoding.ASCII.GetString(item.Value);
val = val.Trim(new char[] { '\0' });
}
else
{ //表示する
}
}
}

方法はないのでしょうか?

回答

ユーザーコメントタグではなくて、XPコメントタグで保存されているようです。
XPコメントタグの説明を見ると
Exif.Image.XPComment Comment tag used by Windows, encoded in UCS2
となっているように、Windows独自のタグだそうです。

foreach (PropertyItem pi in img.PropertyItems)
{
    if (pi.Id == 40092) // 40092(0x9c9c)がXPコメントタグのID
    {
       Console.WriteLine(Encoding.Unicode.GetString(pi.Value));
    }
}

プロパティ →「詳細」に表示されるデータは画像ファイルの情報以外にも音楽ファイルなどの情報もあるため、詳細で表示される各項目の値を取得したいというのであれば、コード量が増えてしまいますが以下のコードがいいかと思います。
(Windows\System32フォルダにあるShell32.dllを参照設定に追加)

Shell32.Shell shell = new Shell32.Shell();
Shell32.Folder objFolder;
// ターゲットのファイルがあるフォルダのFolderオブジェクトを取得
objFolder = shell.NameSpace(@"C:\Users\Public\Pictures\Sample Pictures");
if (objFolder != null)
{
    List<string> arrHeaders = new List<string>();
    for (int i = 0; i < 35; i++)
    {
        // 詳細の(ローカライズされた)項目名を取得
        arrHeaders.Add(objFolder.GetDetailsOf(objFolder.Items(), i));
    }
    // ターゲットファイルのFolderItemオブジェクトを取得
    FolderItem objFolderItem = objFolder.ParseName("Chrysanthemum.jpg");
    if(objFolderItem != null){
        for (int i = 0; i < 35; i++)
        {
            // 各項目の値を表示
            Console.WriteLine(
                arrHeaders[i] + "=" + objFolder.GetDetailsOf(objFolderItem, i)
            );
        }
        objFolderItem = null;
    }
    objFolder = null;
}
編集 履歴 (0)
  • ありがとうございます!
    教えていただいたコードで、”コメント”の取得ができました!

    取得しようとしていたモノが違っていたのですね。
    こういう調べ方もまだ未熟な為、とても勉強になります。

    ほんっとうにありがとうございます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。