2010-09-20 12 views
11

Tôi đang tạo một ứng dụng cho phép người dùng áp dụng các công cụ nhất định để phân tích video & hình ảnh. Tôi cần trợ giúp về cách tôi vẽ/ghi lên video được tải vào trình phát phương tiện trong Windows và có thể lưu nó. Nó cần để có thể cho người dùng vẽ tự do và hình dạng trên đó. Cảm ơn trước,Vẽ trên video trong C#

Chris :)

+1

Xem chỉnh sửa mới của tôi: Bạn luôn có thể sử dụng WPF cho cửa sổ chỉnh sửa video và WinForms cho phần còn lại của ứng dụng của bạn. –

Trả lời

2

Đây là nhiệm vụ không nhỏ, nếu không thể thực hiện được với điều khiển wmp trong biểu mẫu thắng.

Tôi không biết cách nào để vẽ trên wmp nhưng bạn có thể vẽ trên bảng trong suốt phủ lên wmp. Thao tác này sẽ không hoạt động nếu video đang phát nhưng bạn có thể hiển thị bản vẽ trong khi video bị tạm dừng. Tôi đã sử dụng kỹ thuật này để vẽ trên một điều khiển video của bên thứ 3 hoạt động tương tự như wmp. (Chỉnh sửa - điều này dường như không hoạt động với điều khiển wmp)

Tuy nhiên, vì các tấm trong suốt thực tế cũng khá phức tạp trong các hình thức chiến thắng, một cách khác là lấy hình ảnh từ video và vẽ lên hình ảnh phủ . Một lần nữa, chỉ khi nó bị tạm dừng.

This kiểm soát thương mại không cho phép vẽ trên video. Nó có một sự kiện kích hoạt mọi khung hình mà bạn có thể sử dụng để vẽ. Nhược điểm lớn nhất, mặc dù là bạn không thể thực sự làm bất cứ điều gì quá ưa thích như thói quen vẽ của bạn cần phải hoàn thành trước khi khung tiếp theo được rút ra.

Tôi thực sự khuyến khích bạn sử dụng WPF (ngay cả khi điều khiển wpf được lưu trữ trong ứng dụng winforms) để hiển thị video của bạn. Đó là toàn bộ dễ dàng hơn để vẽ trên video (bao gồm cả chơi video) trong wpf.

EDIT

Tôi chỉ thử nghiệm vẽ trên wmp sử dụng một bảng điều khiển trong suốt và nó không cư xử như kiểm soát bên thứ 3 tôi đã làm, vì vậy tôi đề nghị bạn làm video chơi chút trong WPF và host that in your winforms app. (Tôi vừa thử nghiệm quá sử dụng @Callums inkcanvas gợi ý và nó hoạt động như một sự quyến rũ)

+0

Cảm ơn, nhưng làm thế nào để tôi làm điều này kỹ thuật đặt một WPF trong một WinForm? Hay tôi cần phải loại bỏ nó hoàn toàn và chỉ cần làm lại nó trên WPF? nhưng nếu có một cách mà tôi không phải xóa và thay đổi dự án của tôi để WPF thì đó sẽ là lý tưởng :) –

+0

@ Chris: Bạn có thể đặt một điều khiển WinForm vào WPF nhưng không phải là cách khác xung quanh. –

+1

@Callum - Không đúng - bạn có thể lưu trữ một điều khiển wpf bên trong một ứng dụng winforms: http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.elementhost.aspx –

1

Nếu bạn đang sử dụng WPF, hãy thử placinganInkCanvas trên video của bạn và thiết lập Background để minh bạch. Sau đó, bạn có thể lưu và tải lên các hình dạng mà người dùng vẽ lên đầu video.

Một chút proof-of-concept với một hình ảnh thay vì một video:

alt text

tôi nghi ngờ bạn có thể được sử dụng WinForms tuy nhiên, nơi này có thể khó khăn hơn. Nếu vậy, một lý do chính đáng để tìm hiểu WPF!


EDIT: Với WinForms, bạn sẽ phải thực hiện điều khiển tùy chỉnh của riêng bạn mà đóng vai trò như một lớp phủ trong suốt và thêm nét cọ với nó. Sẽ rất khó thực hiện tốt (với nền trong suốt, không hoạt động tốt với WinForms). Tôi khuyên bạn nên sử dụng WPF nếu bạn vẫn đang ở giai đoạn bạn có thể thay đổi giao diện người dùng của ứng dụng. WPF hoạt động trên XP trở lên.


EDIT2: Sau khi googling, có một số InkCanvas equivalents mà mọi người đã đặt cho WinForms, nhưng tôi không có ý tưởng như thế nào tốt họ đang có và có thể không hỗ trợ nền trong suốt.

Bạn luôn có thể có video mà bạn muốn chú thích trong cửa sổ WPF mới và phần còn lại của ứng dụng trong WinForms.

+0

Vì vậy, tôi nên làm gì vì tôi đang thực hiện nó trên một WinForm trong XP? –

-2

Ok, bằng cách xa và cách tốt nhất để làm điều này là sử dụng Silverlight. Silverlight hỗ trợ tất cả các định dạng phát trực tuyến chính và cũng cung cấp quyền truy cập đầy đủ vào bộ đệm khung.

Dễ dàng :-)

+0

Silverlight chỉ là một tập con của WPF được thiết kế để sử dụng với các trang web. –

+0

Tôi không theo dõi? Vui lòng xem http://wpfslguidance.codeplex.com/releases/view/30311. Nó không chỉ là một tập hợp con của WPF, một khi những khác biệt lớn chính là việc phân phối các ứng dụng Silverlight dễ dàng như thế nào thông qua Web. Xem hỗ trợ lớp phủ video trong Silverlight để biết thêm thông tin. –

+0

@Chris đã có ứng dụng winforms hiện có mà anh ấy muốn chức năng này. Silverlight giải quyết điều đó như thế nào? Ngoài ra SL không thể chạy trong sự tin tưởng đầy đủ (cao-vâng nhưng không đầy đủ) và SL MediaElement chỉ có thể phát WMV VC-1 hoặc h.264 video ra khỏi hộp. WMP hoặc WPF MediaPlayer có thể phát lại bất kỳ video nào mà người dùng đã cài đặt codec. –

0

Bạn có thể xem XNA (www.xna.com) từ Microsoft. Nó được tạo cho các ngôn ngữ được quản lý như C# và nên support video.

Tôi chỉ sử dụng nó để vẽ trong C#, nhưng nó được hoàn thành công việc.

Tôi cũng nên lưu ý rằng XNA sẽ hoạt động như một phần của ứng dụng Windows Forms thông thường. Đối với những gì nó có giá trị, tôi cũng đã prototyped một cái gì đó như thế này với Flash; Flash cho phép bạn nhập từng khung hình của tệp phim vào trình chỉnh sửa và tạo một SWF có thể phản hồi tương tác của người dùng.

Tuy nhiên, cách tiếp cận này là vô ích nếu bạn cần cập nhật phim trong thời gian thực. Flash (cuối cùng tôi đã chọn) chỉ có thể nhập phim tại thiết kế thời gian.

0

Tôi đã tìm thấy cách thực hiện việc này.
Dưới đây là một cách trong WPF sử dụng Canvas

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(); 
    } 
} 

sau đó tạo ra các sự kiện chuột cho Canvas và vẽ với nó

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); 
} 
1

Điều này có thể được thực hiện trong WinForms nhưng nó không phải là dễ dàng. Có hỗ trợ hình thức minh bạch với pha trộn alpha trong WinForms. Sử dụng CreateParams sau đây cho biểu mẫu lớp phủ trong suốt: WS_EX_LAYERED, WS_EX_TRANSPARENT. Kiểm tra các tài liệu tham khảo MSDN cho loại cửa sổ: http://msdn.microsoft.com/en-us/library/ms997507.aspx, http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#layered.

Đặt biểu mẫu trong suốt phía trên điều khiển video của bạn và bạn có thể vẽ bất kỳ thứ gì bạn muốn trên đó. Di chuyển và thay đổi kích thước các sự kiện cần phải được phối hợp giữa cửa sổ video của bạn và biểu mẫu trong suốt phía trên nó. Vẽ lại lớp phủ cần sử dụng UpdateLayeredWindow() trong user32.dll.

Tôi đã học được một chút từ ví dụ này: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.