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.
}
}
何か案は?
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と相関していますが、ここでは望ましくない可能性があります。
注:img
はSystem.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);
}
この投稿 から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;
}
}
私は与えられた答えとコメントを組み合わせて、これを思いついた:
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;
}
}
}