C# WPF当图像加载时,宽度和高度被切换

c0vxltue  于 2023-10-22  发布在  C#
关注(0)|答案(2)|浏览(158)

在WPF c#中,在运行时从代码加载图像时,当宽度和高度切换时,一些图像正在加载,因此宽度=高度和高度=宽度,因此图像旋转90度。在文件系统属性选项卡中,宽度和高度是正确的,并且图像显示正确。如果我在任何imageViewer中打开此图像,图像将正确显示,但如果我在powerpoint中打开它,则会发现相同的问题,并且图像会被翻转。我下载了一些其他的代码在WPF和所有显示的图像转向。大多数图像显示正确。
例如这张图片:https://www.dropbox.com/s/5fki0ew3gt78myi/TestImage_Widht4000_Height6000.JPG?dl=0
宽度= 4000和高度=6000,但如果我得到位图.PixelWidth=6000和位图.PixelHeight=400
谁能帮帮忙!谢谢
我什么都试过了:(

var ImagefilePath = SelectedImagePath + "\\" + ((object[])(e.AddedItems))[0].ToString();

            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri(ImagefilePath.ToString(), UriKind.Absolute);

            bitmap.EndInit();

            // Set Image.Source  
            imgPhoto.Source = bitmap;

            ImageInfoText.Content=" W=" + bitmap.PixelWidth + " H=" + bitmap.PixelHeight;
qnzebej0

qnzebej01#

它最有可能是图像本身的元数据。你需要摆脱元数据,这应该解决你的问题。
这里有一个类似的问题:WPF some images are rotated when loaded
以下是如何删除元数据:Easy way to clean metadata from an image?
更好的方法是使用System.Windows.Media.Imaging.BitmapEncoder类的Metadata集合属性。

niwlg2el

niwlg2el2#

通常人们在用移动的手机拍照/视频时会遇到这种问题。他们报告传感器的大小,无论手机是如何持有(横向或纵向)。这些文件还包含元数据,指示手机是否转动了90度。Windows文件资源管理器使用此元数据,并在手机转动时切换宽度和高度。因此,从文件资源管理器中,你会得到这样的印象:在横向和纵向模式下,高度和宽度会发生变化。但他们没有。不幸的是,WPF有点过时,只相信手机报告的高度和宽度。
mp4文件的元数据示例:

Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661),
yuv420p(tv, bt709, progressive), 3840x2160, 71957 kb/s, 32.24 fps,
        29.83 tbr, 90k tbn (default)
  Metadata:
    creation_time   : 2023-08-05T09:04:15.000000Z
    handler_name    : VideoHandle
    vendor_id       : [0][0][0][0]
  Side data:
    displaymatrix: rotation of -90.00 degrees

手机被转了90度的信息在最后一行。
意味着你必须读取那个文件的元数据。这可以通过使用像TagLib这样的库来完成:

var fileProperties = TagLib.File.Create(startFile.FullName);
var tagLibTag = (TagLib.Image.CombinedImageTag)fileProperties.Tag;
var rotation = tagLibTag.Orientation switch {
  TagLib.Image.ImageOrientation.None => Rotation.Rotate0,
  TagLib.Image.ImageOrientation.TopLeft => Rotation.Rotate0,
  TagLib.Image.ImageOrientation.BottomRight => Rotation.Rotate180,
  TagLib.Image.ImageOrientation.RightTop => Rotation.Rotate90,
  TagLib.Image.ImageOrientation.LeftBottom => Rotation.Rotate270, //
  _ => throw new NotSupportedException(),
};
var bitmap = new BitmapImage();
var stopwatch = new Stopwatch();
stopwatch.Start();
bitmap.BeginInit();
bitmap.UriSource = new Uri(startFile.FullName);
bitmap.Rotation = rotation;
bitmap.EndInit();
PictureViewer.Source = bitmap;

不幸的是,Taglib不适用于MP4文件。但是还有其他的图书馆。
请阅读我关于codeproject WPF的文章:Displaying Photos and Videos Properly in Portrait and Landscape orientation以获得更详细的解释和mp4文件处理的代码。

相关问题