【问题标题】:Correcting Image Orientation server side in vb.net在 vb.net 中更正图像方向服务器端
【发布时间】:2013-10-10 21:28:36
【问题描述】:

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

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

【问题讨论】:

  • 您是否要求提供可能采用 Image 和 RotateFlip 的代码,例如 Rotate90??
  • 是的。服务器端的图像是 JPEG 文件的形式,所以我想打开 JPEG 文件,旋转其中的图像,然后使用相同的文件名将旋转后的图像写回 JPEG 文件。这是最基本的操作,但除此之外,我还在 VB.Net 4.5 中寻找一种算法,它可以自动更正它找到的任何带有 EXIF 方向标签的 JPEG 图像,例如上面的。我一直在尝试写这篇文章,但到目前为止都失败了。
  • .NET 不支持 EXIF,因此您必须使用其中一个库来读取该部分的 EXIF 数据。其余的,旋转位图非常简单,并且是 .NET 原生的。

标签: vb.net image orientation exif


【解决方案1】:

对于任何需要这个的人,我基本上使用 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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2018-07-02
      • 2014-05-12
      • 2011-02-04
      • 2013-03-06
      • 2012-04-24
      • 2016-12-12
      相关资源
      最近更新 更多