Вращение изображений с использованием GDI

#c# #asp.net-mvc-3 #gdi #metadata #jpeg

#c# #asp.net-mvc-3 #gdi #метаданные #jpeg

Вопрос:

Я работаю над вращением изображения с помощью GDI . Согласно метаданным изображения, должно быть 8 различных типов ориентации (http://www.impulseadventure.com/photo/exif-orientation.html ). Но я получаю одинаковую ориентацию для всех изображений, независимо от того, находятся ли они в горизонтальной или вертикальной ориентации. Кто-нибудь может подсказать, в чем проблема или я что-то упускаю?

Спасибо!

Комментарии:

1. К ВАШЕМУ сведению, GDI и ASP.NET не обязательно играть хорошо : Classes within the System.Drawing namespace are not supported for use within a Windows or ASP.NET service. Attempting to use these classes from within one of these application types may produce unexpected problems, such as diminished service performance and run-time exceptions. For a supported alternative, see Windows Imaging Components.

2. Компоненты образа Windows также не поддерживаются, документация неверна. Я также на 100% уверен, что Система. Рисование не поддерживается, потому что его чрезвычайно сложно использовать должным образом, а неправильное использование приведет к утечкам памяти и обработке. Но его можно использовать правильно и безопасно.

3. [Уточнение] Компоненты образов Windows поддерживаются только в выпуске 2 Windows Server 2008 и выше, а также в Windows 7. Более ранние версии страдают от тех же проблем, что и GDI . WPF не поддерживается, точка. Они все еще обнаруживают новые утечки памяти с его помощью. И GDI , и WIC (на этих 2 платформах) можно безопасно использовать в веб-сервисе, если вы соблюдаете все правила и знаете все ошибки. imageresizing.net библиотека позволяет вам использовать любой из них.

Ответ №1:

Пару дней назад я добавил автоматическое вращение в imageresizing.net библиотека в качестве плагина автозапуска. Я включаю соответствующий исходный код, который, надеюсь, поможет вам.

 if (!"true".Equals(settings["autorotate"], StringComparison.OrdinalIgnoreCase)) return RequestedAction.None;

int propertyId = 0x0112;
PropertyItem pi;
try {
    pi = b.GetPropertyItem(propertyId);
} catch (ArgumentException) {
    return RequestedAction.None;
}
if (pi == null) return RequestedAction.None;

int total = 0;

foreach (byte by in pi.Value) total  = by; //Does not handle values larger than 255, but it doesn't need to, and is endian-agnostic.

if (total == 8) b.RotateFlip(RotateFlipType.Rotate270FlipNone);
if (total == 3) b.RotateFlip(RotateFlipType.Rotate180FlipNone);
if (total == 6) b.RotateFlip(RotateFlipType.Rotate90FlipNone);

if (total == 2) b.RotateFlip(RotateFlipType.RotateNoneFlipX);
if (total == 4) b.RotateFlip(RotateFlipType.Rotate180FlipX);
if (total == 5) b.RotateFlip(RotateFlipType.Rotate270FlipY);
if (total == 7) b.RotateFlip(RotateFlipType.Rotate90FlipY);

b.RemovePropertyItem(propertyId);
 

К вашему сведению, если вы выполняете изменение размера изображения в ASP.NET , вы должны прочитать эту статью о том, как сделать это безопасно, или использовать изменение размера изображения.Вместо этого чистая библиотека.

Ответ №2:

Просто небольшое улучшение,

Я бы не стал проверять исключение argumentexception, которое требует циклов процессора.

    var orientation_index = Array.IndexOf(b.PropertyIdList, propertyId );

        if ( orientation_index <0) return RequestedAction.None;
        byte total =0;
        foreach (byte b in b.GetPropertyItem(OrientationId).Value)
        {
            total  = b;
        }