在Safari iOS中,一个已知的问题是,用相机拍摄的大图像上设置了exif方向标志,这使得图像的方向在观看时不正确。例如,如果一个iPhone处于纵向方向,并且拍摄了一张图片,则生成的图像将被旋转成景观。已经创建了名为megapix-image.js和exif.js的Jquery插件,通过检测相机图像上的exif方向标志并自动旋转图像来补偿这种情况。我在我的web应用程序中使用这一点,它在客户端运行良好,但我遇到的问题是,我需要将旋转的映像返回到服务器。发送回服务器的映像是输入type=file控件中的图像。这是megapix图像旋转图像的来源。我需要做的是用旋转的图像替换存储在输入type=file控件中的图像,这样就可以上传图像了。换句话说,只在客户端旋转图像是没有价值的,除非让用户暂时看到图像与他们用相机拍照时的方向相同。最重要的是旋转图像被上传回服务器。我希望我把这句话说清楚了,这是有道理的。如何将旋转的图像返回到输入type=file控件中,使其成为上传的图像,而不是方向不正确的图像?
编辑:
我在各种设备上做了更多的测试:在运行iPhone4的iOS 7、运行iOS 7的iPad和运行iOS 6的iPad上,通过输入type=file控件在Safari和服务器上都存在定位问题。垂直压缩/次采样问题在iOS 7中固定在iPhone4和iPad上。在运行iPhone 7的iOS 5C上,在Safari中方向是正确的,但是存在垂直压缩/次采样问题。
发布于 2013-10-11 20:36:50
这一问题已得到如下解决:
正如前面所说的,您不能在文件控件中修改图像文件数据,所以所做的任何事情都必须在服务器端完成。下面是我创建的用于更改图像定向服务器端的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
https://stackoverflow.com/questions/19233527
复制相似问题