在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中的方向是正确的,但存在垂直挤压/子采样问题。
答案 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