DY N DY

opencvsharp WPF연동하여 file 열기(open file dialog, drag) 본문

PARK/영상처리 관련

opencvsharp WPF연동하여 file 열기(open file dialog, drag)

손세지 2016. 12. 7. 00:14

opencvsharp 3.1버전, visual studio 2015 사용. 


연동 자체는 http://dyndy.tistory.com/261 여기에 포스팅. 

포스팅과는 약간 다른 방법인데 쉽게 글로 설명하자면 WPF 프로젝트를 만든 후 

솔루션 탐색기 -> 참조 오른쪽 클릭 -> Nuget 패키지 관리 -> 찾아보기 탭에서 OpenCvSharp3-AnyCPU 검색하여 해당하는 wrapper로 설치

(여기에서는 opencv 3.1버전을 이용할 것이므로 해당하는 wrapper인 3.1 wrapper를 설치하였음) 

하는 방법도 있다.


아무튼 연동이 끝났으면 우선 xaml로 가서 open file dialog를 열 버튼을 하나 드래그해서 만들어주고

요즘은 파일을 드래그엔 드롭하여 여는것이 대세이므로..(?) 그것도 구현해주기 위해 StackPanel을 하나 만들어준다. 

이렇게 만들어진 컨트롤들에 버튼은 Click이벤트, StackPanel은 Drop이벤트를 만들고 StackPanel은 AllowDrop을 True로 해준다. 

아래와 같다.

배경색은 그냥 보기 좋으라고..(안좋나?)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window x:Class="dragAndOpen_video.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:dragAndOpen_video"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button x:Name="button" Content="open file" HorizontalAlignment="Left" Margin="432,0,0,10" VerticalAlignment="Bottom" Width="75" Click="button_Click"/>
        <StackPanel HorizontalAlignment="Right" Height="264" Margin="0,10,5,0" VerticalAlignment="Top" Width="497" Drop="image_Drop" AllowDrop="True" Background="Aqua"/>
    </Grid>
</Window>
 
cs

 

이제 코드를 가본다. 

방금 만든 이벤트 두개만 구현하면 된다. 

사실 둘다 구글링 하면 되게 쉽게 찾을 수 있다. 

open file dilaog -> https://msdn.microsoft.com/ko-kr/library/microsoft.win32.openfiledialog(v=vs.110).aspx

drag & drop -> http://stackoverflow.com/questions/5662509/drag-and-drop-files-into-wpf


코드 구현은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace dragAndOpen_video
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void button_Click(object sender, RoutedEventArgs e)
        {
            // Create OpenFileDialog 
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Image";  // Default file name
            dlg.DefaultExt = ".jpg"// Default file extension
            dlg.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif"// Filter files by extension
            //dlg.Filter = "VIDEO file (*.AVI, *.MP4) | *.AVI;*.avi;*.MP4;*.mp4 |";
 
            // Show open file dialog box
            Nullable<bool> result = dlg.ShowDialog();
 
            // Process open file dialog box results
            if (result == true)
            {
                // Open document
                MessageBox.Show(dlg.FileName);
            }
        }
 
        private void image_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
 
                // Assuming you have one file that you care about, pass it off to whatever
                // handling code you have defined.
                MessageBox.Show(files[0]);
            }
        }
    }
}
 
cs


코드 자체는 어려울 것 없고. 

open file dilaog에서 filter를 적용하여 원하는 파일만을 열도록 할 수 있다. 

Drop의 경우 딱히 filter가 없으니 알아서 방어코드를 짜야하나부다. 

우선은 MessageBox로 파일이름을 보여주도록 하였다. 


버튼을 누르면 아래와같이 적용한 필터대로 옵션이 나온다.


파일을 열면 경로와 파일이름까지 나온다. 


드래그로 열게 되면 사전에 필터한 이미지파일뿐만 아니라 아무 파일이나 열 수 있다.