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);
回答1件
あなたの回答
tips
プレビュー