Ориентация изображения и поворот в соответствии с ориентацией

проблема с ориентацией изображения ниже кода

    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, то изображение не будет содержать свойство поворота.