WPF MediaElement视频屏幕截图的大小错误

问题描述

我制作了一个简单的应用程序,可以从MediaElement创建缩略图。我在某个地方犯了一些错误,但是我不知道在哪里。缩略图应填充MainWindow中的图像控件。我在网上搜索,发现了一些结果,但对我来说不起作用。我需要始终将缩略图拉伸以填充整个“图像”框,我认为这是可行的。但是错误显然发生在PNG文件的创建中,或者更确切地说是在rendertargetBitmap的创建中。它创建图片,但是在缩略图周围创建空白图片空间。它让我疯狂。我将不胜感激。提前致谢。我忘了提一下,即使调整MainWindow的大小,缩略图也必须始终填充“图像”框。

XAML:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MediaElementScreenShot"
    mc:Ignorable="d"
    Title="MediaElement ScreenShot App" Height="600" Width="800" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged" WindowStartupLocation="CenterScreen">
<Grid Background="Beige">
    <Grid.ColumnDeFinitions>
        <ColumnDeFinition Width="1*"/>
        <ColumnDeFinition Width="1*"/>
    </Grid.ColumnDeFinitions>
    <Grid.RowDeFinitions>
        <RowDeFinition Height=".2*"/>
        <RowDeFinition Height=".8*"/>
        <RowDeFinition Height=".2*"/>
        <RowDeFinition Height=".8*"/>
    </Grid.RowDeFinitions>
    <TextBlock x:Name="txtNatSize" Grid.Row="2" Margin="5,5,5" textwrapping="Wrap"/>
    <TextBlock x:Name="txtActSize" Grid.Column="2" Margin="5,5" textwrapping="Wrap"/>
    <TextBlock x:Name="txtDesSize" Grid.Column="2" Grid.Row="2" Margin="5,5" textwrapping="Wrap"/>
    <Border Background="Aqua" Grid.Row="1" BorderThickness="1"/>
    <Border Background="Aqua" Grid.Column="2" Grid.Row="1" BorderThickness="1"/>
    <Border Background="Aqua" Grid.Row="3" BorderThickness="1"/>
    <Border Background="Aqua" Grid.Column="2" Grid.Row="3" BorderThickness="1"/>
    <MediaElement x:Name="MediaEl" Grid.Row="1" Margin="5,5"/>
    <Image x:Name="imgNatSize" Grid.Row="3" Margin="5,5" Stretch="Fill"/>
    <Image x:Name="imgActSize" Grid.Column="2" Grid.Row="1" Margin="5,5" Stretch="Fill"/>
    <Image x:Name="imgDesSize" Grid.Column="2" Grid.Row="3" Margin="5,5" Stretch="Fill"/>
    <GroupBox x:Name="grpDPI" Header="DPI: ">
        <Slider x:Name="sldDPI" Minimum="50" Maximum="600" SmallChange="1"/>
    </GroupBox>
</Grid>

VB.NET:

Imports System.IO
Class MainWindow
    Dim IsMediaOpened As Boolean = False
    Dim DPI As Integer
    Private Sub Window_Loaded(sender As Object,e As RoutedEventArgs)
        sldDPI.Value = 96
        MediaEl.source = New Uri("E:\IMG\pic.jpg",UriKind.RelativeOrAbsolute)
    End Sub
    Sub ShowSizes()
        Me.Title = "Size of the window   Width: " & Me.Width & " Height: " & Me.Height
        txtNatSize.Text = "Natural width: " & MediaEl.NaturalVideoWidth &
            " Natural height: " & MediaEl.NaturalVideoHeight &
            " Screen ratio: " & MediaEl.NaturalVideoWidth / MediaEl.NaturalVideoHeight
        txtActSize.Text = "Actual width: " & MediaEl.ActualWidth &
            " Actual height: " & MediaEl.ActualHeight &
            " Screen ratio: " & MediaEl.ActualWidth / MediaEl.ActualHeight
        txtDesSize.Text = "Desired width: " & MediaEl.DesiredSize.Width &
            " Desired height: " & MediaEl.DesiredSize.Height &
            " Screen ratio: " & MediaEl.DesiredSize.Width / MediaEl.DesiredSize.Height
    End Sub
    Private Sub Window_SizeChanged(sender As Object,e As SizeChangedEventArgs)
        Thumbnails()
    End Sub
    Sub Thumbnails()
        If IsMediaOpened = True Then
            ShowSizes()
            'The following scaling conversion tried,but the result was the same small picture in any DPI setting
            'CreateThumbnails(Convert.ToInt32(MediaEl.NaturalVideoWidth) * (DPI / 96),Convert.ToInt32(MediaEl.NaturalVideoHeight) * (DPI / 96),DPI,"Natural")
            CreateThumbnails(MediaEl.NaturalVideoWidth,MediaEl.NaturalVideoHeight,"Natural")
            CreateThumbnails(MediaEl.ActualWidth,MediaEl.ActualHeight,"Actual")
            CreateThumbnails(MediaEl.DesiredSize.Width,MediaEl.DesiredSize.Height,"Desired")
            LoadThumbnails(imgNatSize,"Natural")
            LoadThumbnails(imgActSize,"Actual")
            LoadThumbnails(imgDesSize,"Desired")
        End If
    End Sub
    Sub CreateThumbnails(ByVal mWidth,ByVal mHeight,ByVal DPI,ByVal mName)
        Dim thmbnail As New rendertargetBitmap(mWidth,mHeight,PixelFormats.Pbgra32)
        thmbnail.Render(MediaEl)
        Dim png As New PngBitmapEncoder()
        png.Frames.Add(BitmapFrame.Create(thmbnail))
        Using stm = File.Create("E:\IMG\" & mName & ".png")
            png.Save(stm)
        End Using
    End Sub
    Sub LoadThumbnails(ByVal ImageName As Image,ByVal mName As String)
        Dim bytes = My.Computer.FileSystem.ReadAllBytes("E:\IMG\" & mName & ".png")
        ImageName.source = BitmapFrame.Create(New IO.MemoryStream(bytes),BitmapCreateOptions.None,BitmapCacheOption.OnLoad)
    End Sub
    Private Sub MediaEl_MediaOpened(sender As Object,e As RoutedEventArgs) Handles MediaEl.MediaOpened
        ShowSizes()
        IsMediaOpened = True
        Me.Width = 720
        Me.Height = 480
    End Sub
    Private Sub sldDPI_ValueChanged(sender As Object,e As RoutedPropertyChangedEventArgs(Of Double)) Handles sldDPI.ValueChanged
        DPI = sldDPI.Value
        grpDPI.Header = "DPI: " & DPI
        Thumbnails()
    End Sub
End Class

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...