私は、ユーザーが特定のツールを適用してビデオや画像を分析できるようにするアプリケーションを作成しています。フォーム内のWindowsMediaPlayerに読み込まれたビデオを実際に描画/書き込みし、保存できるようにする方法についてサポートが必要です。ユーザーがフリーハンドで図形を描くことができるようにする必要があります。前もって感謝します、
クリス:)
これは、winformsのwmpコントロールを使用して実行することは不可能ではないにしても、重要なタスクです。
実際にwmpに描画する方法はわかりませんが、wmpにオーバーレイされた透明なパネルに描画することはできます。これは、ビデオが再生されている間は機能しませんが、一時停止している間は図面を表示できます。この手法を使用して、wmpと同様に機能するサードパーティのビデオコントロールを描画しました。(編集-これはwmpコントロールでは機能しないようです)
ただし、実際の透明なパネルはWinFormでもかなり扱いにくいため、別の方法は、ビデオから画像を取得して、オーバーレイされた画像に描画することです。繰り返しますが、一時停止した場合のみです。
この商用コントロールは、ビデオの描画を可能にします。描画に使用できるすべてのフレームを起動するイベントがあります。ただし、大きな欠点は、次のフレームが描画される前に描画ルーチンを終了する必要があるため、あまり凝ったことはできないということです。
ビデオを表示するには、(winformsアプリ内でホストされているwpfコントロールであっても)WPFを使用することを強くお勧めします。wpfでビデオ(ビデオの再生を含む)を描画する方がはるかに簡単です。
編集
透明なパネルを使用してwmpを描画することをテストしましたが、サードパーティのコントロールのように動作しないため、WPFでビデオ再生ビットを実行し、winformsアプリでホストすることをお勧めします。(@Callums inkcanvasの提案を使用してテストしたところ、魅力のように機能します)
WPFを使用している場合は、ビデオの上にInkCanvasを配置 し 、を透明に設定してみてください。次に、ユーザーがビデオの上に描いた図形を保存してロードできます。Background
ビデオの代わりに写真を使用した概念実証:
ただし、WinFormsを使用している可能性がありますが、これはより難しい場合があります。もしそうなら、WPFを学ぶための良い言い訳です!
編集: WinFormsを使用すると、透明なオーバーレイとして機能する独自のカスタムコントロールを作成し、それにブラシストロークを追加する必要があります。うまく実装するのは非常に難しいでしょう(背景が透明で、WinFormsではうまく機能しません)。アプリケーションのUIを変更できる段階にある場合は、WPFを使用することをお勧めします。WPFはXP以降で動作します。
EDIT2:グーグルした後、人々がWinForms用に作成したInkCanvasに相当するものがいくつかありますが、それらがどれほど優れているかはわかりません。透明な背景をサポートしていない可能性があります。
いつでも、注釈を付けたいビデオを新しいWPFウィンドウに表示し、アプリケーションの残りの部分をWinFormsに表示することができます。
私はこれを行う方法を見つけました。
これがCanvasを使用したWPFの1つの方法です
private void buttonPlayVideo_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Filter = "All Files|*.*";
Nullable<bool> result = dlg.ShowDialog();
if (result == true) {
MediaPlayer mp = new MediaPlayer();
mp.Open(new Uri(filename));
VideoDrawing vd = new VideoDrawing();
vd.Player = mp;
vd.Rect = new Rect(0, 0, 960, 540);
DrawingBrush db = new DrawingBrush(vd);
canvas.Background = db;
mp.Play();
}
}
次に、Canvasのマウスイベントを作成し、それを使用して描画します
Point startPoint, endPoint;
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(canvas);
}
private void canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
endPoint = e.GetPosition(canvas);
Line myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = startPoint.X;
myLine.Y1 = startPoint.Y;
myLine.X2 = endPoint.X;
myLine.Y2 = endPoint.Y;
myLine.HorizontalAlignment = HorizontalAlignment.Left;
myLine.VerticalAlignment = VerticalAlignment.Center;
myLine.StrokeThickness = 2;
canvas.Children.Add(myLine);
}
これはWinFormsで実行できますが、簡単ではありません。WinFormsにはアルファブレンディングによる透過的なフォームサポートがあります。透明オーバーレイフォームには、次のCreateParamsを使用します:WS_EX_LAYERED、WS_EX_TRANSPARENT。このタイプのウィンドウのMSDNリファレンスを確認してください:http://msdn.microsoft.com/en-us/library/ms997507.aspx、http://msdn.microsoft.com/en-us/library/ms632599%28VS。 85%29.aspx#layered。
ビデオコントロールの上に透明なフォームを置くと、好きなものを描くことができます。移動およびサイズ変更イベントは、ビデオウィンドウとその上の透明なフォームの間で調整する必要があります。オーバーレイを再描画するには、user32.dllのUpdateLayeredWindow()を使用する必要があります。
私はこの例からかなりのことを学びました:http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel。
MicrosoftのXNA(www.xna.com)をご覧ください。これは、c#などの管理言語用に作成されており、ビデオをサポートする必要があります。
私はそれをc#での描画にのみ使用しましたが、それで作業は完了します。
また、XNAは通常のWindowsフォームアプリの一部として機能することにも注意してください。その価値については、Flashを使用してこのようなもののプロトタイプも作成しました。Flashを使用すると、ムービーファイルの各フレームをエディターにインポートして、ユーザーの操作に応答できるSWFを作成できます。
ただし、ムービーをリアルタイムで更新する必要がある場合、このアプローチは役に立ちません。Flash(最後にチェックした)は、デザイン時にのみムービーをインポートできました。
さて、これを行うための最善の方法は、Silverlightを使用することです。Silverlightは、すべての主要なストリーミング形式をサポートし、フレームバッファーへの完全なアクセスも提供します。
簡単 :-)