QA@IT
«回答へ戻る

回答を投稿

ユーザーコメントタグではなくて、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;
}
ユーザーコメントタグではなくて、XPコメントタグで保存されているようです。
XPコメントタグの説明を見ると
Exif.Image.XPComment Comment tag used by Windows, encoded in UCS2
となっているように、Windows独自のタグだそうです。
```c#
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を参照設定に追加)
```c#
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;
}
```