主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPF: MediaElementからサムネイルを作る

                
Get a thumbnail from MediaElement

 MediaElementで再生する動画からサムネイルを作る。VisualBrushでMediaElementのグラフィックを描画して、それをRenderTargetBitmapを使ってキャプチャ。

r = Windows.Shapes.Rectangle()
w = 100
h = 100
r.Width = w
r.Height = h
r.Fill = self.visualBrush
r.Measure(Windows.Size(w, h))
r.Arrange(Windows.Rect(Windows.Size(w, h)))
r.UpdateLayout()
rtb = Windows.Media.Imaging.RenderTargetBitmap(r.ActualWidth, r.ActualHeight, 96, 96, Windows.Media.PixelFormats.Pbgra32);
rtb.Render(r)
ib = Windows.Media.ImageBrush(rtb)

rect = Windows.Shapes.Rectangle()
rect.Width = 100
rect.Height = 100
rect.Fill = ib




サンプルコード
SharpDevelopでIronPythonのWPFプロジェクトを作成して、下記のIronPythonスクリプトをWindow1.pyにペースト。さらに下にあるXAMLを、Window1.xamlにペーストして実行。ユーザーのビデオフォルダにあるムービーのサムネイルをウィンドウに表示していく。
import wpf

from System.Windows import Application
from System.Windows import Window
import wpf
import gc
import System, System.IO
from System import Windows, Threading
from System.Windows import Window, Controls, Thickness
from System.Windows.Media import Imaging, ImageBrush, Brushes
from System import Action
from System.IO import Directory, DirectoryInfo

class Window1 (Window):
def __init__(self):
wpf.LoadComponent(self, 'Window1.xaml')
self.grid = self.FindName('grid')
self.media1 = self.FindName('media1')
self.visualBrush = self.FindName('visualBrush')
self.files = self.get_videos()

self.thread = Threading.Thread(System.Threading.ThreadStart(self.begin))
self.thread.SetApartmentState(System.Threading.ApartmentState.STA)
self.thread.Start()

def begin(self):
self.files = self.get_videos()
self.Dispatcher.BeginInvoke(Action(self.collect_thumb))

def collect_thumb(self):
if not self.files:
print "finish"
return False
file = self.files.pop(0)
self.media1.Source = System.Uri(file.FullName)
print file.FullName

self.media1.Position = System.TimeSpan(0, 0, 5)
self.media1.Play()

def get_thumbnail(self, target, e):
self.thread.CurrentThread.Join(1000)
r = Windows.Shapes.Rectangle()
w = 100
h = 100
r.Width = w
r.Height = h
r.Fill = self.visualBrush
r.Measure(Windows.Size(w, h))
r.Arrange(Windows.Rect(Windows.Size(w, h)))
r.UpdateLayout()
rtb = Windows.Media.Imaging.RenderTargetBitmap(r.ActualWidth, r.ActualHeight, 96, 96, Windows.Media.PixelFormats.Pbgra32);
rtb.Render(r)
ib = Windows.Media.ImageBrush(rtb)

rect = Windows.Shapes.Rectangle()
rect.Width = 100
rect.Height = 100
rect.Fill = ib

self.grid.AddChild(rect)
self.Dispatcher.BeginInvoke(Action(self.collect_thumb))

def cap(self, target, e):
r = Windows.Shapes.Rectangle()
w = 100
h = 100
r.Width = w
r.Height = h
r.Fill = self.visualBrush
r.Measure(Windows.Size(w, h))
r.Arrange(Windows.Rect(Windows.Size(w, h)))
r.UpdateLayout()
rtb = Windows.Media.Imaging.RenderTargetBitmap(r.ActualWidth, r.ActualHeight, 96, 96, Windows.Media.PixelFormats.Pbgra32);
rtb.Render(r)
ib = Windows.Media.ImageBrush(rtb)

rect = Windows.Shapes.Rectangle()
rect.Width = 100
rect.Height = 100
rect.Fill = ib

self.grid.AddChild(rect)

def get_videos(self):
my_video = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyVideos)
videos = []
videos += DirectoryInfo(my_video).GetFiles("*.wmv", System.IO.SearchOption.AllDirectories)
videos += DirectoryInfo(my_video).GetFiles("*.mov", System.IO.SearchOption.AllDirectories)
videos += DirectoryInfo(my_video).GetFiles("*.avi", System.IO.SearchOption.AllDirectories)
videos += DirectoryInfo(my_video).GetFiles("*.mpg", System.IO.SearchOption.AllDirectories)
videos += DirectoryInfo(my_video).GetFiles("*.mp4", System.IO.SearchOption.AllDirectories)
return videos

window = Window1()
app = Application()
app.Run(window)


<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="wpf2"
Height="700"
Width="800">
<ScrollViewer Width="800" Height="700">
<WrapPanel Name="grid" Width="750" Height="auto">
<MediaElement
Name="media1"
Width="50"
Height="50"
Volume="0"
LoadedBehavior="Manual"
UnloadedBehavior="Close"
ScrubbingEnabled="True"
MediaOpened="get_thumbnail"
/>
<Button Click="cap" Width="30" Height="30"></Button>
<Rectangle Width="100" Height="100">
<Rectangle.Fill>
<VisualBrush
x:Name="visualBrush"
Stretch="Uniform"
Viewport="0,0,1,1"
Visual="{Binding ElementName=media1}" />
</Rectangle.Fill>
</Rectangle>
</WrapPanel>
</ScrollViewer>
</Window>
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。