使用GDI +旋转图像

时间:2011-10-24 12:10:14

标签: c# asp.net-mvc-3 gdi+ metadata jpeg

我正在使用GDI +进行图像旋转。根据图像元数据,应该有8种不同类型的方向(http://www.impulseadventure.com/photo/exif-orientation.html)。但是我对所有图像都有相同的方向,无论它们是水平还是垂直方向。任何人都可以建议问题出在哪里或者我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

只是一个小小的改进,

我不会测试会产生CPU周期的争论。

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

答案 1 :(得分:0)

几天前,我将自动轮播添加到the imageresizing.net library作为AutoRotate插件。我包含了相关的源代码,希望对您有所帮助。

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中进行图像大小调整,you should read this article关于如何安全地执行此操作,或使用ImageResizing.Net library代替。