web-dev-qa-db-ja.com

JPEGメタデータの読み取りの問題(方向)

IPhoneで撮影したJPEG画像があります。デスクトップPC(Windows Photo Viewer、Google Chromeなど)の向きが正しくありません。

写真をアップロードする必要があるASP.NET MVC 3 Webアプリケーションで作業しています(現在pluploadを使用しています)。

EXIFデータの読み取りなど、画像を処理するためのサーバー側コードがいくつかあります。

EXIFメタデータのPropertyTagOrientationフィールドを読み取ってみました(GDI-Image.PropertyItems)。ただし、フィールドは存在しません。

そのため、特定のiPhoneメタデータ、または他のメタデータのいずれかです。

Aurigma Photo Uploaderのような別のツールを使用しました。これはメタデータを正しく読み取り、画像を回転させます。これはどのように行われますか?

他のJPEGメタデータに、Aurigmaが使用する回転が必要であることを知るために必要な情報を含めることができるものを知っていますか?

EXIFデータの読み取りに使用しているコードは次のとおりです。

var image = Image.FromStream(fileStream);

foreach (var prop in image.PropertyItems)
{
   if (prop.Id == 112 || prop.Id == 5029)
   {
      // do my rotate code - e.g "RotateFlip"
      // Never get's in here - can't find these properties.
   }
}

何か案は?

51
RPM1984

検索した方向IDの値が16進数であることを忘れているようです。 112を使用する場合は、0x112を使用する必要があります。

この記事 は、Windowsがボールドアップされた向きの処理方法を説明し、 この1つ あなたがやっていることにかなり関連しているようです。

17
spender

以下は、8つの方向の値に対応するスニペットです。

最初のいくつかのメモ:

EXIF id0x0112はオリエンテーション用です。これは便利なEXIF IDリファレンスです http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

0x0112は、274の16進数に相当します。 PropertyItem.Idのデータ型はintです。つまり、274がここで有用です。

さらに、5029は、おそらく0x5029または20521これは、ThumbnailOrientationと相関していますが、ここでは望ましくない可能性があります。

画像の方向:

注:imgSystem.Drawing.Imageであるか、System.Drawing.Bitmapのようにそれを継承します。

if (Array.IndexOf(img.PropertyIdList, 274) > -1)
{
    var orientation = (int)img.GetPropertyItem(274).Value[0];
    switch (orientation)
    {
        case 1:
            // No rotation required.
            break;
        case 2:
            img.RotateFlip(RotateFlipType.RotateNoneFlipX);
            break;
        case 3:
            img.RotateFlip(RotateFlipType.Rotate180FlipNone);
            break;
        case 4:
            img.RotateFlip(RotateFlipType.Rotate180FlipX);
            break;
        case 5:
            img.RotateFlip(RotateFlipType.Rotate90FlipX);
            break;
        case 6:
            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
            break;
        case 7:
            img.RotateFlip(RotateFlipType.Rotate270FlipX);
            break;
        case 8:
            img.RotateFlip(RotateFlipType.Rotate270FlipNone);
            break;
    }
    // This EXIF data is now invalid and should be removed.
    img.RemovePropertyItem(274);
}
116
ReenignE

この投稿 からID 274を確認する必要があるようです

foreach (PropertyItem p in properties) {
      if (p.Id == 274) {
            Orientation = (int)p.Value[0];
         if (Orientation == 6)
            oldImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
         if (Orientation == 8)
            oldImage.RotateFlip(RotateFlipType.Rotate270FlipNone);
      break;
      }
}
14
Bala R

私は与えられた答えとコメントを組み合わせて、これを思いついた:

    MemoryStream stream = new MemoryStream(data);
    Image image = Image.FromStream(stream);

    foreach (var prop in image.PropertyItems) {
        if ((prop.Id == 0x0112 || prop.Id == 5029 || prop.Id == 274)) {
            var value = (int)prop.Value[0];
            if (value == 6) {
                image.RotateFlip(RotateFlipType.Rotate90FlipNone);
                break;
            } else if (value == 8) {
                image.RotateFlip(RotateFlipType.Rotate270FlipNone);
                break;
            } else if (value == 3) {
                image.RotateFlip(RotateFlipType.Rotate180FlipNone);
                break;
            } 
        }
    }
11
Ron Burgundy