6

在我正在开发的移动 Web 应用程序中,允许用户使用相机拍照,然后将相机图像上传到服务器。我遇到的问题是,在 iOS 设备上,图像会获得一个与其关联的 EXIF 方向标签,例如“ROTATE 90 CW”。此方向标记会导致图像在显示时以错误的方向显示。例如,如果用户使用 iPhone 纵向拍摄某物,则在服务器上查看时,该图像会旋转为横向。我想使用 VB.Net 在服务器端更正此问题,以便我自动检测 EXIF 方向标记,如果它是“ROTATE 90 CW”(或任何其他会使图像显示不正确的值),然后我想自动将图像旋转到正确的方向。总之,我希望服务器上的图像与用户用相机拍照时的样子完全一样。

有人可以发布可以执行此操作的代码吗?提前致谢。

4

2 回答 2

18

对于任何需要这个的人,我基本上使用 VB.Net 中的代码解决了这个问题。我发现这正是我所需要的:

  Public Function TestRotate(sImageFilePath As String) As Boolean
    Dim rft As RotateFlipType = RotateFlipType.RotateNoneFlipNone
    Dim img As Bitmap = Image.FromFile(sImageFilePath)
    Dim properties As PropertyItem() = img.PropertyItems
    Dim bReturn As Boolean = False
    For Each p As PropertyItem In properties
      If p.Id = 274 Then
        Dim orientation As Short = BitConverter.ToInt16(p.Value, 0)
        Select Case orientation
          Case 1
            rft = RotateFlipType.RotateNoneFlipNone
          Case 3
            rft = RotateFlipType.Rotate180FlipNone
          Case 6
           rft = RotateFlipType.Rotate90FlipNone
          Case 8
           rft = RotateFlipType.Rotate270FlipNone
        End Select
      End If
    Next
    If rft <> RotateFlipType.RotateNoneFlipNone Then
      img.RotateFlip(rft)
      System.IO.File.Delete(sImageFilePath)
      img.Save(sImageFilePath, System.Drawing.Imaging.ImageFormat.Jpeg)
      bReturn = True
    End If
    Return bReturn

  End Function
于 2013-10-11T14:15:40.493 回答
2

对于任何有兴趣的人... C# 版本。

public static bool TestRotate(string filePath)
{
    var rft = RotateFlipType.RotateNoneFlipNone;
    var img = Image.FromFile(filePath);
    var properties = img.PropertyItems;
    var value = false;

    foreach (var prop in properties.Where(i => i.Id == 274))
    {
        var orientation = BitConverter.ToInt16(prop.Value, 0);
        rft = orientation == 1 ? RotateFlipType.RotateNoneFlipNone :
                orientation == 3 ? RotateFlipType.Rotate180FlipNone :
                orientation == 6 ? RotateFlipType.Rotate90FlipNone :
                orientation == 8 ? RotateFlipType.Rotate270FlipNone :
                RotateFlipType.RotateNoneFlipNone;
    }

    if (rft != RotateFlipType.RotateNoneFlipNone)
    {
        img.RotateFlip(rft);
        File.Delete(filePath);
        img.Save(filePath, ImageFormat.Jpeg);
        value = true;
    }

    return value;
}
于 2016-06-29T01:59:38.250 回答