Ориентация изображения и поворот в соответствии с ориентацией
проблема с ориентацией изображения ниже кода
string fileName = @"D:\...\...\01012015004435.jpeg";
int rotate = 0;
using (var image = System.Drawing.Image.FromFile(fileName))
{
foreach (var prop in image.PropertyItems)
{
if (prop.Id == 0x112)
{
if (prop.Value[0] == 6)
rotate = 90;
if (prop.Value[0] == 8)
rotate = -90;
if (prop.Value[0] == 3)
rotate = 180;
prop.Value[0] = 1;
}
}
}
и после правильной ориентации я использовал для поворота изображения, например
private static RotateFlipType OrientationToFlipType(string orientation)
{
switch (int.Parse(orientation))
{
case 1:
return RotateFlipType.RotateNoneFlipNone;
break;
case 2:
return RotateFlipType.RotateNoneFlipX;
break;
case 3:
return RotateFlipType.Rotate180FlipNone;
break;
case 4:
return RotateFlipType.Rotate180FlipX;
break;
case 5:
return RotateFlipType.Rotate90FlipX;
break;
case 6:
return RotateFlipType.Rotate90FlipNone;
break;
case 7:
return RotateFlipType.Rotate270FlipX;
break;
case 8:
return RotateFlipType.Rotate270FlipNone;
break;
default:
return RotateFlipType.RotateNoneFlipNone;
}
}
но проблема в первом коде
prop.Id
Я всегда получаю [20625]
prop.Id == 20625
поэтому не удовлетворяют условию каждый раз
сообщите мне, если возникнут какие-либо проблемы или другие варианты.
спасибо
Ответы
Ответ 1
Там, вероятно, достаточно информации в других ответах и комментариях, чтобы собрать все это вместе, но здесь пример рабочего кода.
Этот метод расширения будет принимать System.Drawing
Image
, прочитать его Exif ориентация тег (если он присутствует), и флип/повернуть его (при необходимости).
private const int exifOrientationID = 0x112; //274
public static void ExifRotate(this Image img)
{
if (!img.PropertyIdList.Contains(exifOrientationID))
return;
var prop = img.GetPropertyItem(exifOrientationID);
int val = BitConverter.ToUInt16(prop.Value, 0);
var rot = RotateFlipType.RotateNoneFlipNone;
if (val == 3 || val == 4)
rot = RotateFlipType.Rotate180FlipNone;
else if (val == 5 || val == 6)
rot = RotateFlipType.Rotate90FlipNone;
else if (val == 7 || val == 8)
rot = RotateFlipType.Rotate270FlipNone;
if (val == 2 || val == 4 || val == 5 || val == 7)
rot |= RotateFlipType.RotateNoneFlipX;
if (rot != RotateFlipType.RotateNoneFlipNone)
img.RotateFlip(rot);
}
Ответ 2
Используйте следующее:
-
img.PropertyIdList.Contains(orientationId)
для проверки наличия тега Exif. -
img.GetPropertyItem(orientationId)
чтобы получить его (после проверки выше, в противном случае вы получите ArgumentException
). -
img.SetPropertyItem(pItem)
чтобы установить его.
Я написал простой вспомогательный класс, который делает все это: вы можете проверить полный исходный код здесь.
Другая информация и краткое тематическое исследование также доступны в следующем посте в моем блоге:
Изменить ориентацию изображения для фотографий iPhone и/или Android в NET С#
Ответ 3
Вы можете использовать эту ссылку http://regex.info/exif.cgi для просмотра встроенных метаданных изображения. Если вы не найдете "0x0112" в таблице EXIF, то изображение не будет содержать свойство поворота.