none
ExifのOrientationをリセットしたい RRS feed

  • 質問

  • デジカメやスマホで撮影されたJPEG画像を、
    ExifのOrientationが1になるように回転し直す機能を作りたいと思っています。

    例えば、Orientationが6だったら、
    右に90度回転させてOrientationを1に変更して保存という具合です。

    GDI+のImageクラスを使って、GetPropertyItemでOrientationを参照、
    RotateFlipで回転、SetPropertyItemでOrientationを1に変更して保存、
    としてみたところ、画像自体はうまく回転できているようなのですが、
    エクスプローラなどで表示されるサムネイルが回転して見えるようになってしまいました。

    元々のサムネイルの画像もExifの情報の中に入っていて、
    それが画像自体の方向と一致しなくなったからではと思っているのですが、
    サムネイルも回転させるには、どのような方法がありますでしょうか。

    もしくは、GDI+以外で、
    Exifの回転情報を正しくリセットできるライブラリなどはありますでしょうか。

    2019年11月21日 10:39

すべての返信

  • あまり詳しくありませんが、

    ◆Windows7のIEではorientationタグは対応できていなかったように思います。
      Windows10で確認してますでしょうか。

    次に、デバッグの方法として、

    orientationを書き換えることのできる信頼できる他のアプリケーションの出力と比べる

    をやってみてはどうでしょう。
    何か、コードに誤りがあるかもしれません。

    最後にちょっと気になったのは、orientation=6は時計回りに90度回転した非鏡像ですので、
    元に戻すには反時計回り(=左回り)に90度回転する必要があると思うのですが、どうでしょう。
    http://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf」の(p31)を参考にしました。


    2019年11月22日 7:45
  • > Windows10で確認してますでしょうか。

    はい、テスト環境はWindows10ですが、
    IrfanViewなど、Exifのサムネイルを表示できるアプリを使って、
    GDI+のRotateFlipでは中のサムネイルが追従できていないことを確認しました。

    また、IrfanViewやXnConvertなどで元画像を回転して保存し直した画像は、
    中のサムネイルも同じ向きで表示されました。
    これらのアプリはサムネイルも作り直しているのかもしれませんが、
    同じ処理をGDI+やライブラリなどで実現できないかと思っています。

    > 最後にちょっと気になったのは、orientation=6は時計回りに90度回転した非鏡像ですので、
    > 元に戻すには反時計回り(=左回り)に90度回転する必要があると思うのですが、どうでしょう。

    その前のページに「画面表示する際に行うべき回転処理」と書いてあるので、
    「6だったら時計回りに90度回転して表示する必要がある」という意味だと思います。


    2019年11月22日 8:14
  • ですか。
    確認ですが、同資料
    http://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf」の
    P82のサムネイルのタグにも「orientation」がありますが、これも正しく設定したという事で良いでしょうか。
    サムネイルを回転して保管する方法はわかりませんでした。ご容赦ください。

    それでもだめとなると、GDI+ではできないのかもしれません。
     (1)orientationタグを書き換えるのではなく、サムネイルを削除して保管
    するしかないかもしれません。

    >「6だったら時計回りに90度回転して表示する必要がある」という意味だと思います。
    失礼しました。そのようですね。

    2019年11月22日 9:20
  • > P82のサムネイルのタグにも「orientation」がありますが、これも正しく設定したという事で良いでしょうか。

    これは手持ちのサンプル画像では、元々入っていませんでした。
    そのため、サムネイルも元画像と同じ向きで入れておきたいと思っています。

    > (1)orientationタグを書き換えるのではなく、サムネイルを削除して保管
    > するしかないかもしれません。

    これ自分も同じように考えて、サムネイルに関連しそうなタグを
    すべてRemovePropertyItemで削除してみたところ、
    エクスプローラやIrfanViewなどでも正しい向きで表示されるようになりました。

    IrfanViewでは、元々のサムネイルのサイズで表示されなくなってしまいますが、
    画像の回転方向を変えて保存し直してしまう以上、
    よい方法がなかったら最悪これでもいいかなとも思い始めています。

    文字や数値などのものは、GDI+のSetPropertyItemでできそうなのですが、
    サムネイルのようなバイト列に対してのサンプルが見つからずに困っています。

    2019年11月25日 1:20
  • 普通にJpeg形式のバイト配列が格納されているだけのはずですので、Image.FromStreamでMemoryStream越しに読み込めるんじゃないでしょうか。

    2019年11月25日 1:29
  • nobuo_hさん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    このケースはGDI+に関するものですが、ご質問はWindowsデスクトップSDKに関連しているようです。 
    より良いサポートのために適切なサポートエンジニアと話し合ってください。。

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月25日 4:27