#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;
}