iOS 中的 Exif 方向问题

Exif Orientation issue in iOS

本文关键字:问题 方向 Exif 中的 iOS      更新时间:2023-09-26

在 Safari iOS 中,使用相机拍摄的大图像上设置了一个 exif 方向标志,这使得图像在查看时方向不正确,这是一个已知问题。 例如,如果 iPhone 处于纵向并拍摄了照片,则生成的图像将显示为横向旋转。 Jquery 插件名为 megapix-image.js 和 exif.js 是通过检测相机图像上的 exif 方向标志并自动旋转图像来补偿这种情况来处理这种情况的。 我在我的 Web 应用程序中使用它,它在客户端运行良好,但我遇到的问题是我需要将旋转的图像放回服务器。 发送回服务器的图像是输入类型=文件控件中的图像。 这是百万像素图像用于旋转图像的图像源。 我需要做的是将存储在输入类型=文件控件中的图像替换为旋转的图像,以便它成为上传的图像。换句话说,仅仅在客户端旋转图像没有任何价值,除了让用户暂时看到图像与他们使用相机拍摄照片时的方向相同。 最重要的是旋转的图像被上传回服务器。我希望我的措辞很清楚,这是有道理的。如何将旋转的图像放回输入 type=file 控件中,以便它成为上传的图像,而不是方向不正确的图像?

编辑:

我在各种设备上做了更多的测试:在运行iOS 7的iPhone4,运行iOS 7的iPad和运行iOS 6的iPad上,方向问题在Safari和服务器上都存在输入类型=文件控制。 垂直挤压/子采样问题已在 iPhone 4 和 iPad 上的 iOS 7 中修复。在运行 iOS 7 的 iPhone 5C 上,Safari 中的方向是正确的,但存在垂直挤压/子采样问题。

此问题已按如下方式解决:

正如 Ray Nicholus 上面所说,您不能修改文件控件内部的图像文件数据,因此无论做什么都必须在服务器端完成。 以下是我创建的 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