图片宽度和高度在 visual Studio vb.net 中反转

Image width & height reversed in visual Studio vb.net

当我查看用数码相机拍摄的照片时,高度为4000,宽度为6016,如果我将相机旋转90度拍摄照片。高度为 6016,宽度为 4000。一切都很好,如果我使用文件资源管理器 (Windows 10) 检查图像的属性,它看起来对任何一张图片都是正确的。如果我在 Photoshop 或图片查看器中查看图片,就方向而言,一切看起来都是正确的。在我的应用程序中,我使用 exif 获取宽度和高度,它始终显示宽度为 6016,高度为 4000。如果我通过代码获取图像:

dim orgimage as bitmap = new bitmap("C:/image/picture.jpg") 

宽度始终为 6016,高度始终为 4000,如果我通过 Photoshop 将 4000 更改为 3999,图像宽度和高度在我的应用程序中是正确的。这是 Visual Studios Visual Basic 的限制吗?

造成差异的原因是其他应用程序正在手动应用 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

如果您检查方向 属性 它可能会帮助 answering/helping 您在从相机输出读取照片时宽度和高度相同的问题。 请让我们知道您的发现。

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

EXIF tags, PropertyItem.Id 274