none
Exifのデータ設定 Primary・Exif IFDについて RRS feed

  • 質問

  • Exifのデータ設定について質問があります。
      .NET Frameworkの
      GetPropertyItemメソッド
    を使って、EXIF情報を設定しようとしています。

    このとき、EXIFには、
       Exif IFD
       Primary(0th IFD)
    などが存在するようなのですが、これらを選択することはできるのでしょうか?

    Exif IFD内に記載されている35mm換算焦点距離(ID A405)をデータ設定しようとすると、Exif IFDに追加されるのではなく、Primary(0th IFD)に追加さてしまいます。

    ソースは、下記のサイトを参考に作成しています。
    http://dobon.net/vb/dotnet/graphics/getexifinfo.html

    すみませんが、お願いいたします。

     

    2011年3月27日 8:39

回答

  • > GetPropertyItemメソッド
    >を使って、EXIF情報を設定しようとしています。
    SetPropertyItemでしょうか。 

    >このとき、EXIFには、
    >   Exif IFD
    >   Primary(0th IFD)
    >などが存在するようなのですが、これらを選択することはできるのでしょうか?
    出来ません。どこに書き込むかは、GDI+側で判断しています。

    >Exif IFD内に記載されている35mm換算焦点距離(ID A405)をデータ設定しようとすると、
    >Exif IFDに追加されるのではなく、Primary(0th IFD)に追加さてしまいます。
    PropertyTagExifFocalLengthIn35mmFilm(0xA405)は、Exif ver2.2から追加されたTagです。
    Exif ver 2.2では、Exif IFD Attribute Informationに情報を入れるのが仕様となっています。

    ご存知のとおり、.NET Framework Win Formsの描画ClassはGDI+ 1.0がbaseになっています。
    残念ながらGDI+ 1.0ではPropertyTagExifFocalLengthIn35mmFilmに対応しておらず、
    0th IFDに書き込まれる動作となっています。

    対応策ですが、GDI+ 1.1ではそのTagに対応しているため、
    ManifestにGDI+ 1.1を使うように記述を行い、そのTagに対応させる方法があります。
    但し、現状の描画Classにどのような影響があるかは分かりません。

    ManifestのGDI+ 1.1の箇所は以下のようになります。

      <dependency>
       <dependentAssembly>
        <assemblyIdentity 
         type="win32" 
         name="Microsoft.Windows.GdiPlus" 
         version="1.1.0.0" 
         processorArchitecture="x86"
         publicKeyToken="6595b64144ccf1df"
         language="*"
        />
       </dependentAssembly>
      </dependency>
    

    ※32bitの場合です。processorArchitecture="*"でも良いかもしれません。

    Manifestの詳細は以下を参考にしてください。
    [Application Manifests]
      http://msdn.microsoft.com/en-us/library/aa374191(v=VS.85).aspx

    上記の手段で不都合がある場合、自分でExifを解析する手段になりそうです。
    (C++/CLIなどでGDI+ 1.1部分を別DLLにしてしまう方法でも動作するかもしれませんが未検証です。)

    2011年4月6日 9:01
  • 確か、Windows XP は GDI+ 1.0 のままだったように記憶しています。(かつ、GDI+ 1.1 の再頒布はできない)
    GDI+ 1.1 を使う形で解決を図る場合、Windows Vista 以上であることが前提となるかもしれません。

    # 状況変わっていたらご指摘をお願いします。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月6日 13:13
    モデレータ

すべての返信

  • > GetPropertyItemメソッド
    >を使って、EXIF情報を設定しようとしています。
    SetPropertyItemでしょうか。 

    >このとき、EXIFには、
    >   Exif IFD
    >   Primary(0th IFD)
    >などが存在するようなのですが、これらを選択することはできるのでしょうか?
    出来ません。どこに書き込むかは、GDI+側で判断しています。

    >Exif IFD内に記載されている35mm換算焦点距離(ID A405)をデータ設定しようとすると、
    >Exif IFDに追加されるのではなく、Primary(0th IFD)に追加さてしまいます。
    PropertyTagExifFocalLengthIn35mmFilm(0xA405)は、Exif ver2.2から追加されたTagです。
    Exif ver 2.2では、Exif IFD Attribute Informationに情報を入れるのが仕様となっています。

    ご存知のとおり、.NET Framework Win Formsの描画ClassはGDI+ 1.0がbaseになっています。
    残念ながらGDI+ 1.0ではPropertyTagExifFocalLengthIn35mmFilmに対応しておらず、
    0th IFDに書き込まれる動作となっています。

    対応策ですが、GDI+ 1.1ではそのTagに対応しているため、
    ManifestにGDI+ 1.1を使うように記述を行い、そのTagに対応させる方法があります。
    但し、現状の描画Classにどのような影響があるかは分かりません。

    ManifestのGDI+ 1.1の箇所は以下のようになります。

      <dependency>
       <dependentAssembly>
        <assemblyIdentity 
         type="win32" 
         name="Microsoft.Windows.GdiPlus" 
         version="1.1.0.0" 
         processorArchitecture="x86"
         publicKeyToken="6595b64144ccf1df"
         language="*"
        />
       </dependentAssembly>
      </dependency>
    

    ※32bitの場合です。processorArchitecture="*"でも良いかもしれません。

    Manifestの詳細は以下を参考にしてください。
    [Application Manifests]
      http://msdn.microsoft.com/en-us/library/aa374191(v=VS.85).aspx

    上記の手段で不都合がある場合、自分でExifを解析する手段になりそうです。
    (C++/CLIなどでGDI+ 1.1部分を別DLLにしてしまう方法でも動作するかもしれませんが未検証です。)

    2011年4月6日 9:01
  • 確か、Windows XP は GDI+ 1.0 のままだったように記憶しています。(かつ、GDI+ 1.1 の再頒布はできない)
    GDI+ 1.1 を使う形で解決を図る場合、Windows Vista 以上であることが前提となるかもしれません。

    # 状況変わっていたらご指摘をお願いします。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月6日 13:13
    モデレータ
  • Kozzさん
    Azuleanさん

    ご回答、ありがとうございます。

    Manifestを変更してみましたが、できませんでした。
    自分のPCは、WinXPなので、ムリなようですね。

    近いうちに、Win7のPCを購入予定なので、試してみます。

    2011年4月10日 11:31