当我查看用数码相机拍摄的照片时,如果我通过将相机旋转90度拍摄照片,则高度为4000,宽度为6016。高度是6016,宽度是4000.一切都很好,如果我用文件浏览器(Windows 10)检查图像的属性,它看起来对任一图片都是正确的。如果我在Photoshop或图片查看器中查看图片,就方向而言看起来都是正确的。在我的应用程序中,我使用exif获取宽度和高度,它总是显示宽度为6016,高度为4000.如果我通过代码获得图像:
dim orgimage as bitmap = new bitmap("C:/image/picture.jpg")
宽度始终为6016,高度始终为4000,如果我通过Photoshop将4000更改为3999,图像宽度和高度在我的应用程序中是正确的。这是Visual Studio Visual Basic的限制吗?
答案 0 :(得分:1)
区别的原因是其他应用程序正在手动应用Exif.Image.Orientation(标记274)的更正。
只需检查此标记并相应地旋转位图。
Public Function OrientateImage(img As Image) As Boolean
Const EXIF_ORIENTATION = 274
Dim orientationTag = img.PropertyItems.FirstOrDefault(Function(x) x.Id = EXIF_ORIENTATION)
If orientationTag IsNot Nothing Then
Dim orientation As Short = BitConverter.ToInt16(orientationTag.Value, 0)
Select Case orientation
Case 3
img.RotateFlip(RotateFlipType.Rotate180FlipNone)
Case 6
img.RotateFlip(RotateFlipType.Rotate90FlipNone)
Case 8
img.RotateFlip(RotateFlipType.Rotate270FlipNone)
Case Else
Return False
End Select
End If
Return True
End Function
答案 1 :(得分:0)
如果您检查方向属性,当从相机输出中读取照片时,它可能有助于回答/帮助您解决宽度和高度问题。 请告诉我们你的发现。
Dim orgimage As bitmap = New Bitmap("C:/image/picture.jpg", True)
Dim otherImage As bitmap = New Bitmap("C:/image/picture2.jpg", True)
'Orientation
Dim exifprop As Integer = orgimage.GetPropertyItem(274).Value(0)
Dim exifprop2 As Integer = otherImage.GetPropertyItem(274).Value(0)
'1 = Horizontal (normal)
'2 = Mirror horizontal
'3 = Rotate 180
'4 = Mirror vertical
'5 = Mirror horizontal and rotate 270 CW
'6 = Rotate 90 CW
'7 = Mirror horizontal and rotate 90 CW
'8 = Rotate 270 CW