在我正在开发的移动网络应用程序中,用户可以使用相机拍照并将相机图像上传到服务器。我遇到的问题是,在iOS设备上,图像会获得与它们相关联的EXIF Orientation标记,例如“ROTATE 90 CW”。此方向标记会在显示图像时以错误的方向显示图像。例如,如果用户以纵向方向拍摄iPhone的图片,则在服务器上查看时图像似乎会旋转为横向。我想在服务器端使用VB.Net更正此问题,以便我自动检测EXIF Orientation标签,如果它是“ROTATE 90 CW”(或任何其他值会使图像看起来显示不正确),然后我想自动将图像旋转到正确的方向。总之,我希望服务器上的图像与用户用相机拍照时的图像完全一致。
有人可以发布会执行此操作的代码吗?提前谢谢。
答案 0 :(得分:15)
对于任何需要此功能的人,我基本上都是在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
答案 1 :(得分:0)
对于任何有兴趣的人...... 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;
}