问题描述
我制作了一个简单的应用程序,可以从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 (将#修改为@)