Информация .NET Exif не работает на производственном сервере - PullRequest
0 голосов
/ 29 ноября 2018

Я читаю информацию Exif JPEG для поворота изображения.JPEG загружается в ASP.NET, и я читаю поток загрузки, поворачиваю его и сохраняю.Он отлично работает на моем компьютере разработчика (Windows 10, IIS 10), но когда я пытаюсь на сервере (Windows Server 2012 R2, IIS 8.5), он не работает, он не загружает какую-либо информацию Exif.

Вот код:

void SavePhoto()
{
    // PHOTO is the Html
    HttpPostedFile photo = Request.Files["ProfilePhoto_File"];
    using (var image = Image.FromStream(photo.InputStream, true, true))
    {
        SaveConvertingFormat(image, "output_path.jpg");
    }
}

public static void SaveConvertingFormat(Image image, string outputPath)
{
    int imageWidth = image.Width;
    int imageHeight = image.Height;

    using (var result = new Bitmap(imageWidth, imageHeight))
    {
        using (var g = Graphics.FromImage(result))
        {
            g.DrawImage(image, 0, 0, imageWidth, imageHeight);
        }

        var rotation = GetExifRotate(image, outputPath);
        // IN THE SERVER, rotation IS ALWAYS RotateNoneFlipNone
        if (rotation != RotateFlipType.RotateNoneFlipNone)
            result.RotateFlip(rotation);

        SaveJpeg(result, outputPath, 85);
    }
}

private static void SaveJpeg(this Image img, string filename, int quality)
{
    EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
    ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = qualityParam;
    img.Save(filename, jpegCodec, encoderParams);
}

public static RotateFlipType GetExifRotate(Image img, string outputPath)
{
    // Source: https://stackoverflow.com/a/48347653/72350
    // ERROR:
    // IN THE PRODUCTION SERVER, PropertyIdList IS EMPTY!
    const int ExifOrientationId = 0x112;
    if (!img.PropertyIdList.Contains(ExifOrientationId))
        return RotateFlipType.RotateNoneFlipNone;

    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;

    return rot;
}

Опять же, код выше:

  • Работает : Windows 10, IIS 10
  • Не работает : Windows Server 2012 R2, IIS 8.5

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Нет необходимости удалять данные EXIF.AutoOrient () автоматически устанавливает ориентацию EXIF ​​на TopLeft.

Вы также можете использовать предложение using, так как MagickImage реализует IDisposable.

using (var img = new MagickImage(inputStream))
{
    img.AutoOrient();   // Fix orientation
    img.Write(outputPath);
}
0 голосов
/ 01 декабря 2018

На всякий случай, если у кого-то есть такая же проблема.У меня были проблемы с производственным чтением ориентации с использованием WFP и GDI.

При использовании WPF ошибка была:

System.Runtime.InteropServices.COMException (0x88982F8A): The component registration is invalid.
(Exception from HRESULT: 0x88982F8A)
at System.Windows.Media.Imaging.BitmapMetadata.GetQuery(String query)

РЕШЕНИЕ:

Единственное, что сработало, было использовать: https://github.com/dlemstra/Magick.NET

Код довольно прост:

var img = new MagickImage(inputStream);
img.AutoOrient();   // Fix orientation
img.Strip();        // remove all EXIF information
img.Write(outputPath);

Это также помогло мне удалить 10 сек строк.

...