내보내기(0) 인쇄
모두 확장

방법: Windows Phone용 응용프로그램에서 카메라 초점 사용

2012-02-09

Windows Phone OS 7.1 을 사용하면 단말기 카메라에 프로그래밍 방식으로 액세스할 수 있습니다. 이 항목에서는 프로그래밍 방식으로 자동 초점을 초기화하고 Windows Phone 응용프로그램에서 터치 초점 기능을 사용하는 방법에 대해 설명합니다. 이 내용은 방법: Windows Phone용 기본 카메라 응용프로그램 만들기에서 연결되며 해당 항목에서 기본 카메라 프로젝트를 만들었다는 가정 하에 작성되었습니다.

이 항목은 두 부분으로 나누어집니다.

  1. 자동 초점 초기화

  2. FocusAtPoint를 사용하여 터치 초점 활성화

팁팁:

이 항목은 기본 카메라 샘플에 해당합니다. 전체 프로젝트를 다운로드하려면 Windows Phone용 코드 샘플을 참조하십시오.

이 섹션에서는 UI에 버튼을 추가하고 AF 버튼을 탭하면 자동 초점이 초기화되도록 코드 숨김 파일에 필요한 로직을 추가합니다. AF 버튼의 이벤트 처리기는 OnNavigatedTo 메서드에 추가되고 OnNavigatingFrom 메서드에서 제거됩니다. 모든 단말기가 자동 초점을 지원하는 것은 아니므로 IsFocusSupported 속성을 사용하여 API를 사용할 수 있는지 확인합니다. 촬영이 진행되는 동안 초점을 맞추려고 시도하면 예외가 발생합니다. try/catch 구문을 Focus()()()() 메서드 호출과 함께 사용하십시오.

참고참고:

이 항목은 C# 개발을 기준으로 하지만 Visual Basic 코드도 제공됩니다. 

자동 초점을 초기화하려면

  1. 방법: Windows Phone용 기본 카메라 응용프로그램 만들기에서 만든 기본 카메라 프로젝트를 엽니다.

  2. 기본 페이지 XAML 파일인 MainPage.xaml에서 StackPanel 요소(ShutterButton라는 Button 요소 아래)에 다음 코드를 추가합니다. 이 코드는 카메라 초점에 대한 버튼입니다.

    <Button Name="AFButton" Content="AF" Click="focus_Clicked" FontSize="26" FontWeight="ExtraBold" Height="75"/>
    
    
    

    이 버튼을 클릭하면 focus_Clicked 메서드가 호출됩니다. 이 메서드는 이 항목의 뒷부분에서 만듭니다.

    참고참고:

    이 연습에서 자동 초점 버튼은 단지 PhotoCamera API에 대한 프로그래밍 방식의 액세스를 보여 주기 위한 것입니다. 최종 사용자의 환경을 최적화하려면 이 기능에 대해 응용프로그램이 카메라의 하드웨어 셔터 버튼을 사용하는 것이 좋습니다. 하드웨어 셔터 버튼을 구현하는 방법에 대한 내용은 방법: Windows Phone에서 하드웨어 카메라 셔터 버튼 액세스를 참조하십시오.

  3. 기본 페이지에 대한 코드 숨김 파일인 MainPage.xaml.cs에서 OnNavigatedTo(NavigationEventArgs) 메서드에 다음 코드를 추가합니다. 이 코드는 AutoFocusCompleted 이벤트 처리기를 구현합니다.

      
    // The event is fired when auto-focus is complete.
    cam.AutoFocusCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_AutoFocusCompleted);
    
    
  4. MainPage.xaml.cs에서 OnNavigatedTo 메서드(Disable UI 주석 바로 아래)에 다음 코드를 추가합니다.

    AFButton.IsEnabled = false;
    

    이 코드는 자동 초점 버튼을 사용하지 않도록 설정합니다. 단말기에서 카메라를 사용할 수 없을 때 이 코드가 사용됩니다.

  5. Dispose 메서드를 호출한 후 MainPage.xaml.cs에서 OnNavigatingFrom(NavigatingCancelEventArgs) 메서드에 다음 코드를 추가합니다. 이 코드는 카메라와 관련된 메모리를 해제하는 데 사용됩니다.

    cam.AutoFocusCompleted -= cam_AutoFocusCompleted;
    
    
  6. MainPage.xaml.cs에서 다음 코드를 MainPage 클래스에 추가합니다. 이 코드는 카메라 초점 작업을 초기화하여 focus_Clicked 이벤트에 대한 이벤트 처리기를 구현합니다.

        // Provide auto-focus in the viewfinder.
        private void focus_Clicked(object sender, System.Windows.RoutedEventArgs e)
        {
            if (cam.IsFocusSupported == true)
            {
                //Focus when a capture is not in progress.
                try
                {
                    cam.Focus();
                }
                catch (Exception focusError)
                {
                    // Cannot focus when a capture is in progress.
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                        txtDebug.Text = focusError.Message;
                    });
                }
            }
            else
            {
                // Write message to UI.
                this.Dispatcher.BeginInvoke(delegate()
                {
                    txtDebug.Text = "Camera does not support programmable auto focus.";
                });
            }
        }
    
    
  7. MainPage.xaml.cs에서 다음 코드를 MainPage 클래스에 추가합니다. 이 코드는 AutoFocusCompleted 이벤트 처리기를 구현하여 txtDebug라는 TextBlock에 메시지를 기록합니다. BeginInvoke 메서드는 응용프로그램의 UI가 다른 스레드에서 실행되기 때문에 필요합니다.

    참고참고:

    초점 작업이 완료되고 나면 AutoFocusCompleted 이벤트가 발생합니다. Focus()()()() 메서드와 FocusAtPoint(Double, Double) 메서드 둘 다 초점 작업을 초기화합니다.

        void cam_AutoFocusCompleted(object sender, CameraOperationCompletedEventArgs e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(delegate()
            {
                // Write message to UI.
                txtDebug.Text = "Auto focus has completed.";
    
            });
        }
    
    
  8. 단말기에서 디버그 | 디버깅 시작 메뉴 명령을 선택하여 응용프로그램을 실행합니다.

이 섹션에서는 (뷰파인더를 탭한 지점을 표시하기 위해) UI에 몇몇 브래킷을 추가하고, 뷰파인더를 탭한 지점에서 초점을 초기화하는 데 필요한 로직을 코드 숨김 파일에 추가합니다. Windows Phone SDK 7.1 에서 FocusAtPoint(Double, Double) 메서드는 터치 초점을 구현하기 위해 사용됩니다.

캔버스 탭의 이벤트 처리기는 OnNavigatedTo 메서드에 추가됩니다. 모든 단말기가 특정 지점 초점을 지원하는 것은 아니므로 IsFocusAtPointSupported 속성을 사용하여 API를 사용할 수 있는지 확인합니다. 촬영이 진행되는 동안 초점을 맞추려고 시도하면 예외가 발생합니다. try/catch 구문을 FocusAtPoint(Double, Double) 메서드 호출과 함께 사용하십시오.

참고참고:

이 섹션에서는 이전 섹션인 자동 초점 초기화를 이미 완료했다고 가정합니다.

터치 초점을 구현하려면

  1. 기본 페이지 XAML 파일 MainPage.xaml에서 Canvas 컨트롤 내(viewfinderBrush라는 비디오 브러시를 포함하는 Canvas.Background 요소 아래)에 다음 코드를 추가합니다.

                <!-- Brackets for Touch Focus -->
                <TextBlock 
                    x:Name="focusBrackets" 
                    Text="[   ]" 
                    FontSize="40"
                    Visibility="Collapsed"/>
    
    

    이 코드는 초점이 발생한 지점을 나타내는 데 사용되는 브래킷을 포함하는 TextBlock 요소입니다. 브래킷은 카메라가 초점을 맞추고 있는 중일 때만 표시됩니다.

  2. 기본 페이지에 대한 코드 숨김 파일인 MainPage.xaml.cs에서 OnNavigatedTo(NavigationEventArgs) 메서드에 다음 코드를 추가합니다.

        // The event is fired when the viewfinder is tapped (for focus).
        viewfinderCanvas.Tap += new EventHandler<GestureEventArgs>(focus_Tapped);
    
    

    이 코드는 캔버스 탭에 대한 이벤트 처리기를 처리합니다. 사용자가 뷰파인더를 탭하여 터치 초점을 초기화하면 focus_Tapped 메서드가 호출됩니다.

  3. MainPage.xaml.cs에서 다음 코드를 MainPage 클래스에 추가합니다.

            // Provide touch focus in the viewfinder.
            void focus_Tapped(object sender, GestureEventArgs e)
            {
                if (cam != null)
                {
                    if (cam.IsFocusAtPointSupported == true)
                    {
                        try
                        {
                            // Determine the location of the tap.
                            Point tapLocation = e.GetPosition(viewfinderCanvas);
    
                            // Position the focus brackets with the estimated offsets.
                            focusBrackets.SetValue(Canvas.LeftProperty, tapLocation.X - 30);
                            focusBrackets.SetValue(Canvas.TopProperty, tapLocation.Y - 28);
    
                            // Determine the focus point.
                            double focusXPercentage = tapLocation.X / viewfinderCanvas.Width;
                            double focusYPercentage = tapLocation.Y / viewfinderCanvas.Height;
    
                            // Show the focus brackets and focus at point.
                            focusBrackets.Visibility = Visibility.Visible;
                            cam.FocusAtPoint(focusXPercentage, focusYPercentage);
    
                            // Write a message to the UI.
                            this.Dispatcher.BeginInvoke(delegate()
                            {
                                txtDebug.Text = String.Format("Camera focusing at point: {0:N2} , {1:N2}", focusXPercentage, focusYPercentage);
                            });
                        }
                        catch (Exception focusError)
                        {
                            // Cannot focus when a capture is in progress.
                            this.Dispatcher.BeginInvoke(delegate()
                            {
                                // Write a message to the UI.
                                txtDebug.Text = focusError.Message;
                                // Hide focus brackets.
                                focusBrackets.Visibility = Visibility.Collapsed;
                            });
                        }
                    }
                    else
                    {
                        // Write a message to the UI.
                        this.Dispatcher.BeginInvoke(delegate()
                        {
                            txtDebug.Text = "Camera does not support FocusAtPoint().";
                        });
                    }
                }
            }
    
    

    이 코드는 (추정 좌표를 사용하여) 초점 브래킷의 위치를 지정하고, 초점을 결정하고, 초점 브래킷을 표시하고, 탭 위치에 해당하는 지점에서 초점을 초기화함으로써 터치 초점을 사용할 수 있게 합니다.

    브래킷의 X, Y 위치는 textBlock 컨트롤의 왼쪽 위 모퉁이에 해당합니다. 브래킷의 위치를 지정할 때 탭 위치 "주위"에 보다 정확하게 브래킷의 위치를 지정하기 위해 좌표에서 약간의 값을 뺍니다.

    FocusAtPoint(Double, Double) 메서드 매개 변수는 이미지의 비율을 기반으로 합니다. 이 코드를 단순하게 하기 위해 탭 이벤트, viewfinderCanvas라는 Canvas 컨트롤을 트리거할 컨트롤에 의도적으로 카메라 뷰파인더 이미지를 표시했습니다. 이러한 접근 방식으로 GestureEventArgs에서 focus_Tapped 메서드로 전달된 좌표는 Canvas 컨트롤 너비와 높이에 직접적으로 비례합니다.

  4. MainPage.xaml.cs에서 cam_AutoFocusCompleted 메서드(BeginInvoke 호출 내, txtDebug 문 바로 뒤)에 다음 코드를 추가합니다.

        // Hide the focus brackets.
        focusBrackets.Visibility = Visibility.Collapsed;
    
    

    이 코드는 초점 작업이 완료되고 나면 초점 브래킷을 숨깁니다.

표시:
© 2014 Microsoft