iOS中的Exif Orientation问题

时间:2013-10-07 19:57:00

标签: javascript iphone ios

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

编辑:

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

1 个答案:

答案 0 :(得分:1)

问题已解决如下:

正如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