質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1404閲覧

WPFで動画のサムネイルをstackpanelに一覧表示したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/02/24 08:08

編集2016/02/24 13:35

WPFで動画のサムネイルをstackpanelに一覧表示したいです。
http://blog.shibayan.jp/entry/20140622/1403369829
を参考に、次のようにして、ひとつのスマートな方法を探しています。

現在は一度ファイルに落として読み直しています。
これを直接はできないでしょうか。

Image directimage = (Image)bitmap;
とcastできないか試したのですが、
System.Windows.Media.Imaging.RenderTargetBitmapを
System.Windows.Controls.Imageにはcastできないとのエラー。
cast方法をご示唆いただけたらうれしいです。

int maxWidth = 180;

// キャプチャする動画を読み込む
// 動画を開いてすぐに一時停止する
player.Open(new Uri(file, UriKind.Absolute));
player.Pause();

// 指定位置へシーク
player.Position = TimeSpan.FromSeconds(10);//32, 5, 10などを試す

// 読み込みが完了するまで待機
while (player.DownloadProgress < 1.0 && player.NaturalVideoWidth == 0)
Thread.Sleep(100);

// リサイズ後のサイズを計算
var ratio = (double)maxWidth / player.NaturalVideoWidth;

int width = (int)(player.NaturalVideoWidth * ratio);
int height = (int)(player.NaturalVideoHeight * ratio);
//-になるので補正。
if (width<0) width = 180;
if (height < 0) height = 120;

// 描画用の Visual を用意
var visual = new DrawingVisual();

using (var context = visual.RenderOpen())
context.DrawVideo(player, new System.Windows.Rect(0, 0, width, height));

// レンダリングするビットマップを用意
var bitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);

// ビットマップに Visual をレンダリング
bitmap.Render(visual);

// PNG として保存
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var stream = File.OpenWrite(file + "thumb.png")) encoder.Save(stream);

//Image directimage = (Image)bitmap;//cast不可
Image image = new Image();
image.Source = new BitmapImage(new Uri(file + "thumb.png",UriKind.Absolute));
stackPanel.Children.Add(image);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho_cs

2016/02/24 08:19

`MediaPlayer`のインスタンス生成時の処理が記載されていませんが`ScrubbingEnabled`に`true`を設定していますか?
退会済みユーザー

退会済みユーザー

2016/02/24 08:32

はい。記載して設定しています。
退会済みユーザー

退会済みユーザー

2016/02/24 08:34

MediaPlayer player = new MediaPlayer { ScrubbingEnabled = true }; のplayerは複数の動画で使うと思ったので、methodの外で実行しましたが、それはOKでしょうか。 methodの中で実行しても、結果は同じでした。 thumbnailは黒でした。
guest

回答1

0

ベストアンサー

ビットマップに Visual をレンダリング以降を以下の感じでどうでしょう。

csharp

1// ビットマップに Visual をレンダリング 2bitmap.Render(visual); 3 4Image image = new Image(); 5image.Source = BitmapFrame.Create(bitmap).GetCurrentValueAsFrozen() as BitmapFrame; 6stackPanel.Children.Add(image);

投稿2016/02/24 09:13

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問