11

私は、ユーザーが特定のツールを適用してビデオや画像を分析できるようにするアプリケーションを作成しています。フォーム内のWindowsMediaPlayerに読み込まれたビデオを実際に描画/書き込みし、保存できるようにする方法についてサポートが必要です。ユーザーがフリーハンドで図形を描くことができるようにする必要があります。前もって感謝します、

クリス:)

4

6 に答える 6

2

これは、winformsのwmpコントロールを使用して実行することは不可能ではないにしても、重要なタスクです。

実際にwmpに描画する方法はわかりませんが、wmpにオーバーレイされた透明なパネルに描画することはできます。これは、ビデオが再生されている間は機能しませんが、一時停止している間は図面を表示できます。この手法を使用して、wmpと同様に機能するサードパーティのビデオコントロールを描画しました。(編集-これはwmpコントロールでは機能しないようです)

ただし、実際の透明なパネルはWinFormでもかなり扱いにくいため、別の方法は、ビデオから画像を取得して、オーバーレイされた画像に描画することです。繰り返しますが、一時停止した場合のみです。

この商用コントロールは、ビデオの描画を可能にします。描画に使用できるすべてのフレームを起動するイベントがあります。ただし、大きな欠点は、次のフレームが描画される前に描画ルーチンを終了する必要があるため、あまり凝ったことはできないということです。

ビデオを表示するには、(winformsアプリ内でホストされているwpfコントロールであっても)WPFを使用することを強くお勧めします。wpfでビデオ(ビデオの再生を含む)を描画する方がはるかに簡単です。

編集

透明なパネルを使用してwmpを描画することをテストしましたが、サードパーティのコントロールのように動作しないため、WPFでビデオ再生ビットを実行し、winformsアプリでホストすることをお勧めします。(@Callums inkcanvasの提案を使用してテストしたところ、魅力のように機能します)

于 2010-09-20T14:21:37.040 に答える
1

WPFを使用している場合は、ビデオの上にInkCanvasを配置 、を透明に設定してみてください。次に、ユーザーがビデオの上に描いた図形を保存してロードできます。Background

ビデオの代わりに写真を使用した概念実証:

代替テキスト

ただし、WinFormsを使用している可能性がありますが、これはより難しい場合があります。もしそうなら、WPFを学ぶための良い言い訳です!


編集: WinFormsを使用すると、透明なオーバーレイとして機能する独自のカスタムコントロールを作成し、それにブラシストロークを追加する必要があります。うまく実装するのは非常に難しいでしょう(背景が透明で、WinFormsではうまく機能しません)。アプリケーションのUIを変更できる段階にある場合は、WPFを使用することをお勧めします。WPFはXP以降で動作します。


EDIT2:グーグルした後、人々がWinForms用に作成したInkCanvasに相当するものがいくつかありますが、それらがどれほど優れているかはわかりません。透明な背景をサポートしていない可能性があります。

いつでも、注釈を付けたいビデオを新しいWPFウィンドウに表示し、アプリケーションの残りの部分をWinFormsに表示することができます。

于 2010-09-20T14:10:31.767 に答える
1

私はこれを行う方法を見つけました。
これが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);
}
于 2012-12-06T04:33:46.763 に答える
1

これは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

于 2014-03-10T19:55:13.607 に答える
0

MicrosoftのXNA(www.xna.com)をご覧ください。これは、c#などの管理言語用に作成されており、ビデオをサポートする必要があります。

私はそれをc#での描画にのみ使用しましたが、それで作業は完了します。

また、XNAは通常のWindowsフォームアプリの一部として機能することにも注意してください。その価値については、Flashを使用してこのようなもののプロトタイプも作成しました。Flashを使用すると、ムービーファイルの各フレームをエディターにインポートして、ユーザーの操作に応答できるSWFを作成できます。

ただし、ムービーをリアルタイムで更新する必要がある場合、このアプローチは役に立ちません。Flash(最後にチェックした)は、デザイン時にのみムービーをインポートできました。

于 2010-09-20T22:57:15.093 に答える
-2

さて、これを行うための最善の方法は、Silverlightを使用することです。Silverlightは、すべての主要なストリーミング形式をサポートし、フレームバッファーへの完全なアクセスも提供します。

簡単 :-)

于 2010-09-20T14:41:10.100 に答える