Xamarin.iOS에서 수동 카메라 컨트롤Manual Camera Controls in Xamarin.iOS

제공 하는 수동 카메라 컨트롤을 AVFoundation Framework ios 8에서 모바일 응용 프로그램이 iOS 장치의 카메라를 통해 완전 한 제어를 허용 합니다.The Manual Camera Controls, provided by the AVFoundation Framework in iOS 8, allow a mobile application to take full control over an iOS device's camera. 전문가 수준 카메라 응용 프로그램을 만들어 이미지 또는 비디오를 계속 수행 하는 동안 카메라의 매개 변수를 조정 하 여 아티스트 컴퍼지션을 제공이 세분화 된 수준의 제어를 사용할 수 있습니다.This fine-grained level of control can be used to create professional level camera applications and provide artist compositions by tweaking the parameters of the camera while taking a still image or video.

과학 또는 산업용 응용 프로그램을 개발 하면 덜 맞춰진 정확성 또는 이미지의 장점은 않았고 맞춰진 보다 일부 기능이 나 사용 하는 이미지의 요소를 강조 표시 하는 경우에 이러한 컨트롤 유용할 수 있습니다.These controls can also be useful when developing scientific or industrial applications, where the results are less geared towards the correctness or beauty of the image, and are geared more towards highlighting some feature or element of the image being taken.

AVFoundation 캡처 개체AVFoundation Capture Objects

같은지 여부를 비디오 또는 iOS 장치에서 카메라를 사용 하 여 이미지를 계속 수행, 해당 이미지를 캡처하는 데 사용 하는 프로세스 대부분입니다.Whether taking video or still images using the camera on an iOS device, the process used to capture those images is largely the same. 기본 자동 카메라 컨트롤 또는 새 수동 카메라 컨트롤을 활용 하는 것을 사용 하는 응용 프로그램의 그렇습니다.This is true of applications that use the default automated camera controls or ones that take advantage of the new Manual Camera Controls:

입력에서 가져온 것을 AVCaptureDeviceInputAVCaptureSession 의 방식으로 AVCaptureConnection합니다.Input is taken from an AVCaptureDeviceInput into an AVCaptureSession by way of an AVCaptureConnection. 결과 여전히 이미지 또는 비디오 스트림으로 출력 중 하나입니다.The result is either output as a still image or as a video stream. 전체 프로세스에 의해 제어 되는 AVCaptureDevice합니다.The entire process is controlled by an AVCaptureDevice.

제공 되는 수동 제어Manual Controls Provided

IOS 8에서 제공 하는 새 Api를 사용 하는 응용 프로그램 다음 카메라 기능을 제어할을 사용할 수 있습니다.Using the new APIs provided by iOS 8, the application can take control of the following camera features:

  • 수동 포커스 – 응용 프로그램 직접 포커스를 제어 하려면 최종 사용자를 허용 하면 가져온 이미지 보다 자세히 제어를 제공할 수 있습니다.Manual Focus – By allowing the end user to take control of the focus directly, an application can provide more control over the image taken.
  • 수동 노출 – 수동 노출 제어를 제공 하 여 응용 프로그램 사용자에 게 더 자유롭게 제공를 스타일이 지정 된 참조를 얻을 수 있도록 합니다.Manual Exposure – By providing manual control over the exposure, an application can provide more freedom to users and allow them to achieve a stylized look.
  • 수동 흰색 균형 – 백서 분산 이미지에서 색을 조정 하는-현실적인 보이도록 하는 빈도입니다.Manual White Balance – White Balance is used to adjust the color in an image—often to make it look realistic. 다른 광원은 다른 색 온도 있고 이러한 차이점에 대 한 보정을 위해 이미지를 캡처하는 데 사용 하는 카메라 설정을 조정 됩니다.Different light sources have different color temperatures, and the camera settings used to capture an image is adjusted to compensate for these differences. 다시 사용자에 대 한 제어 흰색 분산 함으로써 사용자 조정을 자동으로 수행할 수 없는 가능 합니다.Again, by allowing the user control over the white balance, users can make adjustments that cannot be done automatically.

기존 iOS Api 이미지가 세밀 하 게 제어할 수 있도록 향상 된 캡처 프로세스 및 iOS 8 확장을 제공 합니다.iOS 8 provides extensions and enhancements to existing iOS APIs to provide this fine-grained control over the image capture process.

대괄호로 묶은 캡처Bracketed Capture

대괄호로 묶은 캡처 위의 수동 카메라 컨트롤의 설정을 기반으로 하며 응용 프로그램을 잠시 시간 내에 다양 한 방식으로 캡처할 수 있습니다.The Bracketed Capture is based on the settings from the Manual Camera Controls presented above and allows the application to capture a moment in time, in a variety of different ways.

간단히 말해서 다양 한 그림 그림에서 설정이 계속 찍은 폭주는 캡처 대괄호로 묶습니다.Simply stated, Bracketed Capture is a burst of still images taken with a variety of settings from picture to picture.

요구 사항Requirements

다음은이 기사에서 설명한 단계를 완료 하려면 필요 합니다.The following are required to complete the steps presented in this article:

  • Xcode 7 이상 및 iOS 8 이상 – Apple의 Xcode 7 및 iOS 8 또는 최신 Api 설치 하 고 개발자의 컴퓨터에서 구성 해야 합니다.Xcode 7+ and iOS 8 or newer – Apple's Xcode 7 and iOS 8 or newer APIs need to be installed and configured on the developer's computer.
  • Mac 용 visual Studio – 최신 버전의 Mac 용 Visual Studio를 설치 하 고 사용자 장치에 구성 해야 합니다.Visual Studio for Mac – The latest version of Visual Studio for Mac should be installed and configured on the user device.
  • iOS 8 장치 – 최신 버전의 iOS 8 실행 하는 iOS 장치.iOS 8 Device – An iOS device running the latest version of iOS 8. IOS 시뮬레이터에서에서 카메라 기능을 테스트할 수 없습니다.Camera features cannot be tested in the iOS Simulator.

일반 AV 캡처 설치General AV Capture Setup

IOS 장치에서 비디오 녹화 하는 경우에 다음과 같은 몇 가지 일반 설정 코드는 항상 필수입니다.When recording video on an iOS device, there is some general setup code that is always required. 이 섹션에서는 iOS 장치의 카메라에서 비디오를 기록 하 고 해당 비디오를 표시 하는 데 필요한 최소한의 설치를 설명 하는 실시간으로 UIImageView합니다.This section will cover the minimal setup that is required to record video from the iOS device's camera and display that video in real-time in a UIImageView.

출력 샘플 버퍼 대리자Output Sample Buffer Delegate

샘플 출력 버퍼를 모니터링 하 여 버퍼에서 놓은 이미지를 표시 하는 대리자 됩니다 필요한 첫 번째 작업 중 하나는 UIImageView 응용 프로그램 UI입니다.One of the first things needed will be a delegate to monitor the Sample Output buffer and display an image grabbed from the buffer to a UIImageView in the application UI.

다음 루틴 샘플 버퍼 모니터링 되며 UI를 업데이트 합니다.The following routine will monitor the Sample Buffer and update the UI:

using System;
using Foundation;
using UIKit;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using AVFoundation;
using CoreVideo;
using CoreMedia;
using CoreGraphics;

namespace ManualCameraControls
{
    public class OutputRecorder : AVCaptureVideoDataOutputSampleBufferDelegate
    {
        #region Computed Properties
        public UIImageView DisplayView { get; set; }
        #endregion

        #region Constructors
        public OutputRecorder ()
        {

        }
        #endregion

        #region Private Methods
        private UIImage GetImageFromSampleBuffer(CMSampleBuffer sampleBuffer) {

            // Get a pixel buffer from the sample buffer
            using (var pixelBuffer = sampleBuffer.GetImageBuffer () as CVPixelBuffer) {
                // Lock the base address
                pixelBuffer.Lock (0);

                // Prepare to decode buffer
                var flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little;

                // Decode buffer - Create a new colorspace
                using (var cs = CGColorSpace.CreateDeviceRGB ()) {

                    // Create new context from buffer
                    using (var context = new CGBitmapContext (pixelBuffer.BaseAddress,
                        pixelBuffer.Width,
                        pixelBuffer.Height,
                        8,
                        pixelBuffer.BytesPerRow,
                        cs,
                        (CGImageAlphaInfo)flags)) {

                        // Get the image from the context
                        using (var cgImage = context.ToImage ()) {

                            // Unlock and return image
                            pixelBuffer.Unlock (0);
                            return UIImage.FromImage (cgImage);
                        }
                    }
                }
            }
        }
        #endregion

        #region Override Methods
        public override void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
        {
            // Trap all errors
            try {
                // Grab an image from the buffer
                var image = GetImageFromSampleBuffer(sampleBuffer);

                // Display the image
                if (DisplayView !=null) {
                    DisplayView.BeginInvokeOnMainThread(() => {
                        // Set the image
                        if (DisplayView.Image != null) DisplayView.Image.Dispose();
                        DisplayView.Image = image;

                        // Rotate image to the correct display orientation
                        DisplayView.Transform = CGAffineTransform.MakeRotation((float)Math.PI/2);
                    });
                }

                // IMPORTANT: You must release the buffer because AVFoundation has a fixed number
                // of buffers and will stop delivering frames if it runs out.
                sampleBuffer.Dispose();
            }
            catch(Exception e) {
                // Report error
                Console.WriteLine ("Error sampling buffer: {0}", e.Message);
            }
        }
        #endregion
    }
}

현재 위치에서이 루틴을 사용 하 여는 AppDelegate 라이브 비디오 피드를 기록할 AV 캡처 세션을 엽니다. 하도록 수정할 수 있습니다.With this routine in place, the AppDelegate can be modified to open an AV Capture Session to record a live video feed.

AV 캡처 세션 만들기Creating an AV Capture Session

AV 캡처 세션 iOS 장치의 카메라에서 라이브 비디오 기록 제어 하는 데 사용 되 고 iOS 응용 프로그램에 비디오 하는 데 필요한 합니다.The AV Capture session is used to control recording of live video from the iOS Device's camera and is required to get video into an iOS application. 이 예제에서는 이후 ManualCameraControl 샘플 응용 프로그램은 캡처 세션을 사용 하 여 여러 위치에서이 구성 하는 AppDelegate 전체 응용 프로그램에 사용할 수 있게 합니다.Since the example ManualCameraControl sample application is using the capture session in several different places, it will be configured in the AppDelegate and made available to the entire application.

응용 프로그램을 수정 하려면 다음을 수행 AppDelegate 필요한 코드를 추가 합니다.Do the following to modify the application's AppDelegate and add the necessary code:

  1. 두 번 클릭 하 여 AppDelegate.cs 열어 편집 하려면 솔루션 탐색기에서 파일.Double-click the AppDelegate.cs file in the Solution Explorer to open it for editing.

  2. 다음 추가 파일의 맨 위에 문을 사용 하 여:Add the following using statements to the top of the file:

    using System;
    using Foundation;
    using UIKit;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Linq;
    using AVFoundation;
    using CoreVideo;
    using CoreMedia;
    using CoreGraphics;
    using CoreFoundation;
    
  3. 계산 된 속성을 확인 하 고 다음 private 변수를 추가 합니다 AppDelegate 클래스:Add the following private variables and computed properties to the AppDelegate class:

    #region Private Variables
    private NSError Error;
    #endregion
    
    #region Computed Properties
    public override UIWindow Window {get;set;}
    public bool CameraAvailable { get; set; }
    public AVCaptureSession Session { get; set; }
    public AVCaptureDevice CaptureDevice { get; set; }
    public OutputRecorder Recorder { get; set; }
    public DispatchQueue Queue { get; set; }
    public AVCaptureDeviceInput Input { get; set; }
    #endregion
    
  4. 완료 메서드를 재정의 하 고로 변경 합니다.Override the finished method and change it to:

    public override void FinishedLaunching (UIApplication application)
    {
        // Create a new capture session
        Session = new AVCaptureSession ();
        Session.SessionPreset = AVCaptureSession.PresetMedium;
    
        // Create a device input
        CaptureDevice = AVCaptureDevice.DefaultDeviceWithMediaType (AVMediaType.Video);
        if (CaptureDevice == null) {
            // Video capture not supported, abort
            Console.WriteLine ("Video recording not supported on this device");
            CameraAvailable = false;
            return;
        }
    
        // Prepare device for configuration
        CaptureDevice.LockForConfiguration (out Error);
        if (Error != null) {
            // There has been an issue, abort
            Console.WriteLine ("Error: {0}", Error.LocalizedDescription);
            CaptureDevice.UnlockForConfiguration ();
            return;
        }
    
        // Configure stream for 15 frames per second (fps)
        CaptureDevice.ActiveVideoMinFrameDuration = new CMTime (1, 15);
    
        // Unlock configuration
        CaptureDevice.UnlockForConfiguration ();
    
        // Get input from capture device
        Input = AVCaptureDeviceInput.FromDevice (CaptureDevice);
        if (Input == null) {
            // Error, report and abort
            Console.WriteLine ("Unable to gain input from capture device.");
            CameraAvailable = false;
            return;
        }
    
        // Attach input to session
        Session.AddInput (Input);
    
        // Create a new output
        var output = new AVCaptureVideoDataOutput ();
        var settings = new AVVideoSettingsUncompressed ();
        settings.PixelFormatType = CVPixelFormatType.CV32BGRA;
        output.WeakVideoSettings = settings.Dictionary;
    
        // Configure and attach to the output to the session
        Queue = new DispatchQueue ("ManCamQueue");
        Recorder = new OutputRecorder ();
        output.SetSampleBufferDelegate (Recorder, Queue);
        Session.AddOutput (output);
    
        // Let tabs know that a camera is available
        CameraAvailable = true;
    }
    
  5. 파일의 변경 내용을 저장합니다.Save the changes to the file.

이 코드를 사용 하 여 수동 카메라 컨트롤 실험 및 테스트에 쉽게 구현할 수 있습니다.With this code in place, the Manual Camera Controls can be easily implemented for experimentation and testing.

수동 포커스Manual Focus

최종 사용자가 포커스의 컨트롤을 직접 수행 함으로써 응용 프로그램 예술적인 제어할 가져온 이미지를 제공할 수 있습니다.By allowing the end user to take controls of the focus directly, an application can provide more artistic control over the image taken.

예를 들어는 전문 사진사 달성 하기 위해 이미지의 포커스를 출시할 수를 빛 망 울 효과:For example, a professional photographer can soften the focus of an image to achieve a Bokeh Effect:

또는 만듭니다는 포커스 끌어오기 효과, 같은:Or, create a Focus Pull Effect, such as:

과학자 또는 의료 응용 프로그램 기록기에 대 한 응용 프로그램 프로그래밍 방식으로 이동 하 여 렌즈 실험에 대 한 좋습니다.For scientists or a writer of medical applications, the application might want to programmatically move the lens around for experiments. 어느 방법이 든 새 API 최종 사용자 또는 응용 프로그램을 제어할 포커스 시 이미지 만들어질 수 있습니다.Either way the new API allows either the end user or the application to take control over focus at the time the image is taken.

포커스의 작동 원리How Focus Works

전에 IOS 8 응용 프로그램에서 포커스를 제어 하는 데 대 한 세부 정보를 설명 합니다.Before discussing the details of controlling focus in an IOS 8 application. 포커스 iOS 장치에서 작동 하는 방법을 빠르게 살펴보겠습니다.Let's take a quick look at how focus works in an iOS device:

IOS 장치에서 카메라 렌즈에 진입 빛은 이미지 센서에 중점을 합니다.Light enters the camera lens on the iOS device and is focused on an image sensor. 센서는 관계의 초점은 (이미지 표시 되는 위치는 기술로 영역) 인 렌즈 센서 컨트롤에서의 거리입니다.The distance of the lens from the sensor controls where the Focal Point (the area where the image will appear the sharpest) is, in relationship to the sensor. 센서에서 멀수록 렌즈는, 기술로 보일 거리 개체 및 개체 근처에 가까울수록 서로 기술로 보일The farther the lens is from the sensor, distance objects seem sharpest and the closer, near objects seem sharpest.

IOS 장치에서 렌즈 이동 가깝게 또는 멀리 센서 자석 및 springs 합니다.In an iOS device, the lens is moved closer to, or further from, the sensor by magnets and springs. 결과적으로, 렌즈의 정확한 위치 불가능, 장치 마다 달라질 수 있으며 장치 방향 또는 장치와 spring 기간 같은 매개 변수에 따라 달라질 수 있습니다.As a result, exact positioning of the lens is impossible, as it will vary from device to device, and can be affected by parameters such as the orientation of the device or the age of the device and spring.

중요 한 초점은 용어Important Focus Terms

포커스를 처리할 때에 개발자에 게 익숙한 몇 가지 용어:When dealing with focus, there are a few terms that the developer should be familiar with:

  • 필드의 깊이 – 가장 가까운 및 멀리 포커스 개체 사이의 거리입니다.Depth of Field – The distance between the nearest and farthest in-focus objects.
  • 매크로 -포커스 스펙트럼의 거의 끝 이며 렌즈 집중할 수는 가장 가까운 거리입니다.Macro - This is the near end of the focus spectrum and is the closest distance at which the lens can focus.
  • 무한대 – 포커스 스펙트럼의 맨 끝 이며 먼 거리는 렌즈 집중할 수 있습니다.Infinity – This is the far end of the focus spectrum and is the farthest distance at which the lens can focus.
  • Hyperfocal 거리 – 포커스의 맨 끝에 프레임에서 가장 멀리 개체가 포커스 스펙트럼의 지점입니다.Hyperfocal Distance – This is the point in the focus spectrum where the farthest object in the frame is just at the far end of focus. 즉, 이것이 깊이의 필드를 최대화 하는 초점 위치입니다.In other words, this is the focal position that maximizes Depth of Field.
  • 렌즈 위치 – 위의 모든 제어 대상을 용어입니다.Lens Position – That's what controls all of the above other terms. 이 포커스의 컨트롤러는 센서에서 이동 하 고 있으므로 렌즈의 거리입니다.This is the distance of the lens from the sensor and thereby the controller of focus.

이러한 용어와 염두에서 기술 자료를 사용 하 여 새 수동 포커스가 컨트롤 iOS 8 응용 프로그램에서 성공적으로 구현할 수 있습니다.With these terms and knowledge in mind, the new Manual Focus Controls can be successfully implemented in an iOS 8 application.

기존 포커스가 컨트롤Existing Focus Controls

iOS 7 및 이전 버전을 통해 기존 포커스가 컨트롤을 제공 FocusMode속성:iOS 7, and earlier versions, provided existing Focus Controls via FocusModeproperty as:

  • AVCaptureFocusModeLocked – 포커스가 포커스 단일 지점에서 잠겨 있습니다.AVCaptureFocusModeLocked – The focus is locked at a single focus point.
  • AVCaptureFocusModeAutoFocus -카메라 초점이 찾아 다음 상태를 유지 될 때까지 모든 초점 지점을 통해 렌즈를 추가 합니다.AVCaptureFocusModeAutoFocus – The camera sweeps the lens through all focal points until it finds sharp focus and then stays there.
  • AVCaptureFocusModeContinuousAutoFocus – 카메라에 포커스를 벗어난 상태를 감지할 때마다 refocuses 합니다.AVCaptureFocusModeContinuousAutoFocus – The camera refocuses whenever it detects an out-of-focus condition.

기존 컨트롤을 통해 관심 설정할 수 있는 지점을 제공 합니다FocusPointOfInterest 속성인 사용자 특정 영역에 초점을 맞춰 탭 수 있도록 합니다.The existing controls also provided a settable point of interest via theFocusPointOfInterest property, so that the user can tap to focus on a particular area. 응용 프로그램 모니터링 렌즈 이동을 추적할 수도 있습니다는 IsAdjustingFocus 속성입니다.The application can also track the lens movement by monitoring the IsAdjustingFocus property.

또한 범위 제한이 제공한는 AutoFocusRangeRestriction 속성:In addition, range restriction was provided by the AutoFocusRangeRestriction property as:

  • AVCaptureAutoFocusRangeRestrictionNear –는 autofocus 주변 깊이를 제한합니다.AVCaptureAutoFocusRangeRestrictionNear – Restricts the autofocus to nearby depths. QR 코드 또는 바코드를 스캔 같은 상황에서 유용 합니다.Useful in situations such as scanning a QR Code or barcode.
  • AVCaptureAutoFocusRangeRestrictionFar –는 autofocus 먼 깊이를 제한합니다.AVCaptureAutoFocusRangeRestrictionFar – Restricts the autofocus to distant depths. 보기의 필드 (예를 들어 창 프레임)에서 개체는 무의미 한 것으로 알려져 있는 경우에 유용 합니다.Useful in situations where objects that are known to be irrelevant are in the field of view (for instance, a window frame).

마지막은 SmoothAutoFocus 속성 자동 포커스 알고리즘 속도가 느려지고 비디오를 기록할 때 아티팩트를 이동 하지 않으려면 더 작은 단위로 단계입니다.Finally there is the SmoothAutoFocus property that slows down the auto focus algorithm and steps it in smaller increments to avoid moving artifacts when recording video.

IOS 8의에서 새 포커스 제어New Focus Controls in iOS 8

이미 이상 iOS 7에서 제공 되는 기능을 하는 것 외에도 다음 기능은 이제 iOS 8에서에서 포커스를 제어할 수 있습니다:In addition to the features already provided by iOS 7 and above, the following features are now available to control focus in iOS 8:

  • 수동 전체 컨트롤 포커스를 잠그는 경우 렌즈 위치입니다.Full manual control of the lens position when locking focus.
  • 포커스 모드에서 렌즈 위치 키-값 관찰 합니다.Key-value observation of the lens position in any focus mode.

위의 기능을 구현 하는 AVCaptureDevice 클래스는 읽기 전용을 포함 하도록 수정 되었습니다 LensPosition 카메라 렌즈의 현재 위치를 가져오는 데 사용 되는 속성입니다.To implement the above features, the AVCaptureDevice class has been modified to include a read-only LensPosition property used to get the current position of the camera lens.

렌즈 위치 수동 컨트롤을 사용 하려면 잠겨 포커스 모드에서 캡처 장치 여야 합니다.To take manual control of the Lens Position, the Capture Device must be in the Locked Focus Mode. 예제:Example:

CaptureDevice.FocusMode = AVCaptureFocusMode.Locked;

SetFocusModeLocked 카메라 렌즈의 위치를 조정 하려면 캡처 장치 메서드를 사용 합니다.The SetFocusModeLocked method of the Capture Device is used to adjust the position of the camera lens. 알림이 변경 내용을 적용 하는 경우에 선택적 콜백 루틴을 제공할 수 있습니다.An optional callback routine can be provide to get notification when the change takes effect. 예제:Example:

ThisApp.CaptureDevice.LockForConfiguration(out Error);
ThisApp.CaptureDevice.SetFocusModeLocked(Position.Value,null);
ThisApp.CaptureDevice.UnlockForConfiguration();

위의 코드에서 볼 수 있듯이 렌즈 위치 변경 수 있으려면 먼저 캡처 장치 구성에 대 한 잠겨 있어야 합니다.As seen in the code above, the Capture Device must be locked for configuration before a change in Lens Position can be made. 유효한 렌즈 위치 값은 0.0에서 1.0입니다.Valid Lens Position values are between 0.0 and 1.0.

수동 포커스 예제Manual Focus Example

현재 위치에서 일반 AV 캡처 설치 코드를 사용 하 여를 UIViewController 응용 프로그램의 스토리 보드에 추가할 수 있고 다음과 같이 구성 합니다.With the General AV Capture Setup code in place, a UIViewController can be added to the application's Storyboard and configured as follows:

보기에는 다음 주요 요소가 포함 됩니다.The view contains the following main elements:

  • UIImageView 비디오 피드를 표시 하는 됩니다.A UIImageView that will display the video feed.
  • UISegmentedControl 는 포커스 모드에서 자동으로 바뀝니다 잠금.A UISegmentedControl that will change the Focus Mode from Automatic to Locked.
  • UISlider 표시 되며 현재 렌즈 위치 업데이트입니다.A UISlider that will show and update the current Lens Position.

선 위로 뷰 컨트롤러 수동 포커스가 컨트롤에 대 한 다음을 수행 합니다.Do the following to wire-up the view controller for Manual Focus Control:

  1. 다음 추가 문을 사용 하 여:Add the following using statements:

    using System;
    using Foundation;
    using UIKit;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Linq;
    using AVFoundation;
    using CoreVideo;
    using CoreMedia;
    using CoreGraphics;
    using CoreFoundation;
    using System.Timers;
    
  2. 다음 private 변수를 추가 합니다.Add the following private variables:

    #region Private Variables
    private NSError Error;
    private bool Automatic = true;
    #endregion
    
  3. 다음 계산 된 속성을 추가 합니다.Add the following computed properties:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. 재정의 ViewDidLoad 메서드 다음 코드를 추가 합니다.Override the ViewDidLoad method and add the following code:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
    
        // Hide no camera label
        NoCamera.Hidden = ThisApp.CameraAvailable;
    
        // Attach to camera view
        ThisApp.Recorder.DisplayView = CameraView;
    
        // Create a timer to monitor and update the UI
        SampleTimer = new Timer (5000);
        SampleTimer.Elapsed += (sender, e) => {
            // Update position slider
            Position.BeginInvokeOnMainThread(() =>{
                Position.Value = ThisApp.Input.Device.LensPosition;
            });
        };
    
        // Watch for value changes
        Segments.ValueChanged += (object sender, EventArgs e) => {
    
            // Lock device for change
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
    
            // Take action based on the segment selected
            switch(Segments.SelectedSegment) {
            case 0:
                // Activate auto focus and start monitoring position
                Position.Enabled = false;
                ThisApp.CaptureDevice.FocusMode = AVCaptureFocusMode.ContinuousAutoFocus;
                SampleTimer.Start();
                Automatic = true;
                break;
            case 1:
                // Stop auto focus and allow the user to control the camera
                SampleTimer.Stop();
                ThisApp.CaptureDevice.FocusMode = AVCaptureFocusMode.Locked;
                Automatic = false;
                Position.Enabled = true;
                break;
            }
    
            // Unlock device
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    
        // Monitor position changes
        Position.ValueChanged += (object sender, EventArgs e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic) return;
    
            // Update Focus position
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
            ThisApp.CaptureDevice.SetFocusModeLocked(Position.Value,null);
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    }
    
  5. 재정의 ViewDidAppear 메서드 뷰가 로드 되 면 기록을 시작 하려면 다음을 추가 합니다.Override the ViewDidAppear method and add the following to start recording when the view loads:

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
    
        // Start udating the display
        if (ThisApp.CameraAvailable) {
            // Remap to this camera view
            ThisApp.Recorder.DisplayView = CameraView;
    
            ThisApp.Session.StartRunning ();
            SampleTimer.Start ();
        }
    }
    
  6. 자동 모드에서 카메라를 사용 하 여 슬라이더 카메라 포커스를 조정 하는 대로 자동으로 이동 합니다.With the camera in the Auto mode, the slider will move automatically as the camera adjusts focus:

  7. 잠금 세그먼트를 탭 하 고 렌즈 위치를 수동으로 조정 하려면 슬라이더 위치:Tap the Locked segment and drag the position slider to adjust the lens position manually:

  8. 응용 프로그램을 중지 합니다.Stop the application.

위의 코드 렌즈 위치 카메라 자동 모드에 있을 때 모니터링 잠금 모드에 있을 때 렌즈 위치를 제어 하는 슬라이더를 사용 하는 방법을 보여 주었습니다.The above code has shown how to monitor the lens position when the camera is in the Automatic mode or use a slider to control the lens position when it is in the Locked mode.

수동 노출Manual Exposure

노출 원본 밝기를 기준으로 이미지의 밝기를 나타내고 긴 및 센서 (ISO 매핑) 게인 수준 도달 하는 방법에 대 한 센서에서 빛의 양을 결정 됩니다.Exposure refers to the brightness of an image relative to the source brightness, and is determined by how much light hits the sensor, for how long, and by the gain-level of the sensor (ISO mapping). 수동 노출 제어를 제공 하 여 응용 프로그램 최종 사용자에 게 더 자유롭게 제공 하 고 스타일 모양 허용할 수 있습니다.By providing manual control over the exposure, an application can provide more freedom to the end user and allow them to achieve a stylized look.

수동 노출을 컨트롤을 사용 하는 사용자 어둡게 및 moody 유출이 밝은에서 이미지를 사용할 수 있습니다.Using the Manual Exposure Controls, the user can take an image from unrealistically bright to dark and moody:

마찬가지로이 가능 과학 응용 프로그램 또는 응용 프로그램 사용자 인터페이스에서 제공 하는 수동 컨트롤을 통해 프로그래밍 방식 제어를 자동으로 사용 합니다.Again, this can be done automatically using programmatic control for scientific applications or via manual controls provided by the applications user interface. 어느 방법이 든 새 iOS 8 노출을 Api은 카메라의 노출 설정 세부적으로 제어를 제공 합니다.Either way, the new iOS 8 Exposure APIs provide fine-grained control over the camera's exposure settings.

노출의 작동 원리How Exposure Works

전에 IOS 8 응용 프로그램에 대 한 노출을 제어의 세부 정보를 설명 합니다.Before discussing the details of controlling exposure in an IOS 8 application. 개요 노출의 작동 원리를 살펴보겠습니다.Let's take a quick look at how exposure works:

세 가지 기본 요소 노출을 제어 하 함께 제공 되는 다음과 같습니다.The three basic elements that come together to control exposure are:

  • 속도 셔터 – 셔터 빛의 카메라 센서에 있도록 열려 있는 시간의 길이입니다.Shutter Speed – This is the length of time that the shutter is open to let light onto the camera sensor. 짧은 셔터 열려 있는 경우 시간 적은 광원은 허용 하 고는 선명한 이미지는 (작은 동작 흐림 효과).The shorter the time the shutter is open, the less light is let in and the crisper the image is (less motion blur). 길수록 셔터를 열지 더 많이 발생 하는 흐림 효과 동작 및 자세한 조명 사용 수 있습니다.The longer the shutter is open, the more light is let in and the more motion blur that occurs.
  • ISO 매핑 – 필름 사진에서 가져온 용어임 이며 빛 영화에서는 화학 물질의 민감도 가리킵니다.ISO Mapping – This is a term borrowed from film photography and refers to the sensitivity of the chemicals in the film to light. 영화에서는 낮은 ISO 값 있고 작은 수준이 finer 색 재생; 디지털 센서에서 낮은 ISO 값 어둡게 하지만 센서 노이즈가 경우Low ISO values in film have less grain and finer color reproduction; low ISO values on digital sensors have less sensor noise but less brightness. ISO 값이 높을수록, 밝을수록 이미지 했지만 센서 노이즈를 더 많이 있습니다.The higher the ISO value, the brighter the image but with more sensor noise. "ISO" 디지털 센서에 대 한 측정입니다 electronic 향상, 물리적 기능 하지 않습니다.“ISO” on a digital sensor is a measure of electronic gain, not a physical feature.
  • Aperture 렌즈 – 렌즈 열기의 크기입니다.Lens Aperture – This is the size of the lens opening. 모든 iOS 장치에서 렌즈 구경 고정 되어 있으므로 노출 조정에 사용할 수 있는 두 개의 값은 셔터 속도 및 ISO입니다.On all iOS devices the lens aperture is fixed, so the only two values that can be used to adjust exposure are Shutter Speed and ISO.

연속 하는 방법을 자동 노출 작동How Continuous Auto Exposure Works

학습 하기 전에 수동 노출 작동 방식를 연속 하는 방법을 자동 노출 하는 iOS 장치에서 작동 합니다.Before learning how manual exposure works, it’s a good idea to understand how continuous auto exposure works in an iOS device.

먼저 자동 노출을 블록은 이상적인 노출을 계산 작업이 고 지속적으로 계량 통계 공급 하기는 합니다. 이 정보를 사용 하 여 최적의 켜지 지 잘 장면 ISO 고 셔터 속도의 혼합을 계산 합니다.First is the Auto Exposure Block, it has the job of calculating ideal exposure and is continuously being fed Metering Stats. It uses this information to calculate the optimal mixture of ISO and Shutter Speed to get the scene well lit. 이 주기를 AE 루프 이라고 합니다.This cycle is referred to as the AE Loop.

잠긴된 어떻게 노출 작동How Locked Exposure Works

그런 다음 iOS 장치에서 작동 하는 노출 하는 방법이 잠긴된를 검토해 보겠습니다.Next, let's examine how locked exposure works in iOS devices.

마찬가지로 최적의 iOS 및 Duration 값을 계산 하는 자동 노출을 차단 해야 합니다.Again, you have the Auto Exposure Block that is trying to calculate the optimal iOS and Duration values. 그러나이 모드에서는 AE 블록에서에서 연결이 끊어진 계량 통계 엔진입니다.However, in this mode the AE Block is disconnected from the Metering Stats engine.

기존 노출 제어Existing Exposure Controls

iOS 7 이상을 통해 다음과 같은 기존 노출을 컨트롤을 제공 합니다 ExposureMode 속성:iOS 7 and above, provide the following existing Exposure controls via the ExposureMode property:

  • AVCaptureExposureModeLocked – 장면을 한 번 샘플링 하 고 장면 전체에서 해당 값을 사용 하 여 키를 누릅니다.AVCaptureExposureModeLocked – Samples the scene once and uses those values throughout the scene.
  • AVCaptureExposureModeContinuousAutoExposure – 잘 켜져 있는지 확인 하는 지속적으로 장면을 샘플입니다.AVCaptureExposureModeContinuousAutoExposure – Samples the scene continuously to ensure that it is well lit.

합니다 ExposurePointOfInterest 장면에 노출 하는 대상 개체를 선택 하 여 노출 하려면 탭을 사용할 수 있으며 응용 프로그램을 모니터링할 수는 AdjustingExposure 속성을 노출 조절 될 경우.The ExposurePointOfInterest can be used to tap to expose the scene by selecting a target object to expose on, and the application can monitor the AdjustingExposure property to see when exposure is being adjusted.

IOS 8의에서 새 노출 제어New Exposure Controls in iOS 8

이미 이상 iOS 7에서 제공 되는 기능을 하는 것 외에도 다음 기능은 이제 iOS 8에에서 대 한 노출을 제어 하는 사용 가능한:In addition to the features already provided by iOS 7 and above, the following features are now available to control exposure in iOS 8:

  • 완벽 하 게 수동 사용자 지정 노출 됩니다.Fully manual custom exposure.
  • Get, Set, 키-값 IOS 및 셔터 (기간)를 확인합니다.Get, Set and Key-Value Observe IOS and Shutter Speed (Duration).

위의 기능을 구현 하는 새 AVCaptureExposureModeCustom 모드가 추가 되었습니다.To implement the above features, a new AVCaptureExposureModeCustom mode has been added. 카메라를 사용자 지정 모드 경우 노출을 기간 및 ISO를 조정 하려면 다음 코드를 사용할 수 있습니다.When the camera in is the custom mode, the following code can be used to adjust the Exposure Duration and ISO:

CaptureDevice.LockForConfiguration(out Error);
CaptureDevice.LockExposure(DurationValue,ISOValue,null);
CaptureDevice.UnlockForConfiguration();

자동 및 잠금 모드에서는 응용 프로그램 다음 코드를 사용 하 여 자동 루틴에 대 한 바이어스를 조정할 수 있습니다.In the Auto and Locked modes, the application can adjust the Bias of the automatic exposure routine using the following code:

CaptureDevice.LockForConfiguration(out Error);
CaptureDevice.SetExposureTargetBias(Value,null);
CaptureDevice.UnlockForConfiguration();

최소 및 최대 설정 범위는 되지 하드 코딩 되어야 하므로 응용 프로그램이 실행 중인 장치에 따라 달라 집니다.The minimum and maximum setting ranges depend on the device the application is running on, so they should never be hard coded. 다음 속성을 최소 및 최대 값 범위를 가져오려면 대신 사용 합니다.Instead, use the following properties to get the minimum and maximum value ranges:

  • CaptureDevice.MinExposureTargetBias
  • CaptureDevice.MaxExposureTargetBias
  • CaptureDevice.ActiveFormat.MinISO
  • CaptureDevice.ActiveFormat.MaxISO
  • CaptureDevice.ActiveFormat.MinExposureDuration
  • CaptureDevice.ActiveFormat.MaxExposureDuration

위의 코드에서 볼 수 있듯이 노출 변경 수 있으려면 먼저 캡처 장치 구성에 대 한 잠겨 있어야 합니다.As seen in the code above, the Capture Device must be locked for configuration before a change in exposure can be made.

수동 노출 예제Manual Exposure Example

현재 위치에서 일반 AV 캡처 설치 코드를 사용 하 여를 UIViewController 응용 프로그램의 스토리 보드에 추가할 수 있고 다음과 같이 구성 합니다.With the General AV Capture Setup code in place, a UIViewController can be added to the application's Storyboard and configured as follows:

보기에는 다음 주요 요소가 포함 됩니다.The view contains the following main elements:

  • UIImageView 비디오 피드를 표시 하는 됩니다.A UIImageView that will display the video feed.
  • UISegmentedControl 는 포커스 모드에서 자동으로 바뀝니다 잠금.A UISegmentedControl that will change the Focus Mode from Automatic to Locked.
  • 4 개의 UISlider 표시 되며 오프셋, 기간, ISO 및 편차를 업데이트 하는 컨트롤입니다.Four UISlider controls that will show and update the Offset, Duration, ISO and Bias.

선 위로 뷰 컨트롤러 수동 Exposure Control에 대 한 다음을 수행 합니다.Do the following to wire-up the view controller for Manual Exposure Control:

  1. 다음 추가 문을 사용 하 여:Add the following using statements:

    using System;
    using Foundation;
    using UIKit;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Linq;
    using AVFoundation;
    using CoreVideo;
    using CoreMedia;
    using CoreGraphics;
    using CoreFoundation;
    using System.Timers;
    
  2. 다음 private 변수를 추가 합니다.Add the following private variables:

    #region Private Variables
    private NSError Error; 
    private bool Automatic = true;
    private nfloat ExposureDurationPower = 5;
    private nfloat ExposureMinimumDuration = 1.0f/1000.0f;
    #endregion
    
  3. 다음 계산 된 속성을 추가 합니다.Add the following computed properties:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. 재정의 ViewDidLoad 메서드 다음 코드를 추가 합니다.Override the ViewDidLoad method and add the following code:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
    
        // Hide no camera label
        NoCamera.Hidden = ThisApp.CameraAvailable;
    
        // Attach to camera view
        ThisApp.Recorder.DisplayView = CameraView;
    
        // Set min and max values
        Offset.MinValue = ThisApp.CaptureDevice.MinExposureTargetBias;
        Offset.MaxValue = ThisApp.CaptureDevice.MaxExposureTargetBias;
    
        Duration.MinValue = 0.0f;
        Duration.MaxValue = 1.0f;
    
        ISO.MinValue = ThisApp.CaptureDevice.ActiveFormat.MinISO;
        ISO.MaxValue = ThisApp.CaptureDevice.ActiveFormat.MaxISO;
    
        Bias.MinValue = ThisApp.CaptureDevice.MinExposureTargetBias;
        Bias.MaxValue = ThisApp.CaptureDevice.MaxExposureTargetBias;
    
        // Create a timer to monitor and update the UI
        SampleTimer = new Timer (5000);
        SampleTimer.Elapsed += (sender, e) => {
            // Update position slider
            Offset.BeginInvokeOnMainThread(() =>{
                Offset.Value = ThisApp.Input.Device.ExposureTargetOffset;
            });
    
            Duration.BeginInvokeOnMainThread(() =>{
                var newDurationSeconds = CMTimeGetSeconds(ThisApp.Input.Device.ExposureDuration);
                var minDurationSeconds = Math.Max(CMTimeGetSeconds(ThisApp.CaptureDevice.ActiveFormat.MinExposureDuration), ExposureMinimumDuration);
                var maxDurationSeconds = CMTimeGetSeconds(ThisApp.CaptureDevice.ActiveFormat.MaxExposureDuration);
                var p = (newDurationSeconds - minDurationSeconds) / (maxDurationSeconds - minDurationSeconds);
                Duration.Value = (float)Math.Pow(p, 1.0f/ExposureDurationPower);
            });
    
            ISO.BeginInvokeOnMainThread(() => {
                ISO.Value = ThisApp.Input.Device.ISO;
            });
    
            Bias.BeginInvokeOnMainThread(() => {
                Bias.Value = ThisApp.Input.Device.ExposureTargetBias;
            });
        };
    
        // Watch for value changes
        Segments.ValueChanged += (object sender, EventArgs e) => {
    
            // Lock device for change
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
    
            // Take action based on the segment selected
            switch(Segments.SelectedSegment) {
            case 0:
                // Activate auto exposure and start monitoring position
                Duration.Enabled = false;
                ISO.Enabled = false;
                ThisApp.CaptureDevice.ExposureMode = AVCaptureExposureMode.ContinuousAutoExposure;
                SampleTimer.Start();
                Automatic = true;
                break;
            case 1:
                // Lock exposure and allow the user to control the camera
                SampleTimer.Stop();
                ThisApp.CaptureDevice.ExposureMode = AVCaptureExposureMode.Locked;
                Automatic = false;
                Duration.Enabled = false;
                ISO.Enabled = false;
                break;
            case 2:
                // Custom exposure and allow the user to control the camera
                SampleTimer.Stop();
                ThisApp.CaptureDevice.ExposureMode = AVCaptureExposureMode.Custom;
                Automatic = false;
                Duration.Enabled = true;
                ISO.Enabled = true;
                break;
            }
    
            // Unlock device
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    
        // Monitor position changes
        Duration.ValueChanged += (object sender, EventArgs e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic) return;
    
            // Calculate value
            var p = Math.Pow(Duration.Value,ExposureDurationPower);
            var minDurationSeconds = Math.Max(CMTimeGetSeconds(ThisApp.CaptureDevice.ActiveFormat.MinExposureDuration),ExposureMinimumDuration);
            var maxDurationSeconds = CMTimeGetSeconds(ThisApp.CaptureDevice.ActiveFormat.MaxExposureDuration);
            var newDurationSeconds = p * (maxDurationSeconds - minDurationSeconds) +minDurationSeconds;
    
            // Update Focus position
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
            ThisApp.CaptureDevice.LockExposure(CMTime.FromSeconds(p,1000*1000*1000),ThisApp.CaptureDevice.ISO,null);
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    
        ISO.ValueChanged += (object sender, EventArgs e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic) return;
    
            // Update Focus position
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
            ThisApp.CaptureDevice.LockExposure(ThisApp.CaptureDevice.ExposureDuration,ISO.Value,null);
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    
        Bias.ValueChanged += (object sender, EventArgs e) => {
    
            // If we are in the automatic mode, ignore changes
            // if (Automatic) return;
    
            // Update Focus position
            ThisApp.CaptureDevice.LockForConfiguration(out Error);
            ThisApp.CaptureDevice.SetExposureTargetBias(Bias.Value,null);
            ThisApp.CaptureDevice.UnlockForConfiguration();
        };
    }
    
  5. 재정의 ViewDidAppear 메서드 뷰가 로드 되 면 기록을 시작 하려면 다음을 추가 합니다.Override the ViewDidAppear method and add the following to start recording when the view loads:

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
    
        // Start udating the display
        if (ThisApp.CameraAvailable) {
            // Remap to this camera view
            ThisApp.Recorder.DisplayView = CameraView;
    
            ThisApp.Session.StartRunning ();
            SampleTimer.Start ();
        }
    }
    
  6. 자동 모드에서 카메라를 사용 하 여 슬라이더 카메라 조정 노출 하는 대로 자동으로 이동 합니다.With the camera in the Auto mode, the sliders will move automatically as the camera adjusts exposure:

  7. 잠금 세그먼트를 탭 하 고 슬라이더를 끌어 바이어스를 자동 노출에 대 한 바이어스를 수동으로 조정:Tap the Locked segment and drag the Bias slider to adjust the bias of the automatic exposure manually:

  8. 사용자 지정 세그먼트를 탭 하 고 수동으로 노출을 제어 하는 기간 및 ISO 슬라이더를 드래그 합니다.Tap the Custom segment and drag the Duration and ISO sliders to manually control exposure:

  9. 응용 프로그램을 중지 합니다.Stop the application.

위의 코드는 자동 모드에서는 카메라 경우 노출을 설정을 모니터링 하는 방법을 보여 주었습니다 및 슬라이더를 사용 하 여 잠금 또는 사용자 지정 모드에 있을 때 표시를 제어 하는 방법입니다.The above code has shown how to monitor the exposure settings when the camera is in the Automatic mode, and how to use sliders to control the exposure when it is in the Locked or Custom modes.

수동 흰색 잔액Manual White Balance

흰색 균형 컨트롤 colosr 더 사실적 수 있도록 이미지의 균형을 조정 하는 작업을 할 수 있습니다.White Balance controls allow users to adjust the balance of colosr in an image to make them look more realistic. 다른 광원은 다른 색 온도 있고 이러한 차이점에 대 한 보정을 위해 이미지를 캡처하는 데 사용 하는 카메라 설정을 조정 해야 합니다.Different light sources have different color temperatures, and the camera settings used to capture an image must be adjusted to compensate for these differences. 다시 흰색 분산을 통해 사용자 컨트롤을 허용 하 여 수의 조정을 전문 꾸밈 효과를 얻기 위해 자동 루틴의 지원 되지 않는 합니다.Again, by allowing the user control over the white balance they can make professional adjustments that the automatic routines are incapable of to achieve artistic effects.

예를 들어, 일광 절약 텅스텐 형광등 광원 워 머, 주황색 노랑 색조 있지만 blueish 캐스트를 있습니다.For instance, daylight has a blueish cast, whereas tungsten incandescent lights have a warmer, yellow-orange tint. (스럽지만, "쿨" 색 경우 "웜" 색 보다 더 높은 색 온도(Confusingly, “cool” colors have higher color temperatures than “warm” colors. 색 온도 물리적 측정값을 지 단일에 없습니다.)Color temperatures are a physical measure, not a perceptual one.)

사용자 마음 색 온도 간의 차이 보정 뛰어난 이지만 카메라를 수행할 수 없는 것입니다.The human mind is very good at compensating for the differences in color temperature, but this is something that a camera cannot do. 카메라 색 간의 차이 조정 하는 반대 스펙트럼의 색을 승격 하 여 작동 합니다.The camera works by boosting color on the opposite spectrum to adjust for the color differences.

새 iOS 8 노출을 API를 통해 응용 프로그램 프로세스의 제어에 카메라의 흰색 분산 설정에 대 한 세분화 된 제어를 제공 합니다.The new iOS 8 Exposure API allows the application to take control of the process and provide fine-grained control over the camera's white balance settings.

흰색 어떻게 분산 작동How White Balance Works

전에 IOS 8 응용 프로그램의 흰색 균형을 제어 하는 데 대 한 세부 정보를 설명 합니다.Before discussing the details of controlling white balance in an IOS 8 application. 신속 하 게 확인 하는 방법을 흰색 분산 작동을 살펴보겠습니다.Let's take a quick look at how white balance works:

색상 관념 연구에는 CIE 1931 RGB 색 공간 및 CIE 1931 XYZ 색 공간 첫 번째 색 공간을 수학적으로 정의 됩니다.In the study of color perception, the CIE 1931 RGB color space and CIE 1931 XYZ color space are the first mathematically defined color spaces. 1931에서 국제 Commission 조명을 (CIE)에 의해 생성 되었습니다.They were created by the International Commission on Illumination (CIE) in 1931.

위의 차트 표시의 모든 색 밝은 빨강, 녹색 밝은 파란색에서 사람의 눈에 표시 됩니다.The above chart shows us all of the colors visible to the human eye, from deep blue to bright green to bright red. 위의 그래프에 표시 된 대로 X 및 Y 값을 사용 하 여 다이어그램의 시점을 그릴 수 있습니다.Any point on the diagram can be plotted with an X and Y value, as shown on the graph above.

그래프에 표시로 휴먼 비전의 범위를 벗어난 것을 그래프에 표시할 수 있는 X 및 Y 값 및 결과적으로 카메라에서 이러한 색을 재현할 수 없는 합니다.As visible in the graph, there are X and Y values that can be plotted on the graph that would be outside of the range of human vision, and as a result these colors cannot be reproduced by a camera.

위의 차트에서 작은 곡선 이라고 합니다 Planckian 궤적색 온도 (도 켈빈) (더울) 파란색 우변 많으면를 표현 하는, 및 빨간색 우변 (울지) 더 낮은 숫자입니다.The smaller curve in the above chart is called the Planckian Locus, which expresses the color temperature (in degrees kelvin), with higher numbers on the blue side (hotter) and lower numbers on the red side (cooler). 이러한 일반적인 조명 상황에 유용합니다.These are useful for typical lighting situations.

혼합된 조명 조건에서 필요한 변경을 수행 하려면 Planckian 궤적에서 벗어날 흰색 균형 조정 해야 합니다.In mixed lighting conditions, the white balance adjustments will need to deviate from the Planckian Locus to make the required changes. 조정 해야 하는 이러한 상황에서를 이동 하거나 녹색 또는 CIE 빨간색/자홍 변의 확장 합니다.In these situations the adjustment will need to be shifted either to the green or red/magenta side of the CIE scale.

iOS 장치 반대 색 향상을 승격 하 여 색 캐스트에 대 한 보정 합니다.iOS Devices compensate for color casts by boosting the opposite color gain. 예를 들어, 장면 너무 많이 있으면 빨간색 향상 보정을 위해 상승 됩니다.For instance, if a scene has too much blue, then the red gain will be boosted to compensate. 이러한 향상을 장치에 종속 되므로 값이 특정 장치에 대 한 보정 됩니다.These gain values are calibrated for specific devices so they are device dependent.

기존 흰색 분산 컨트롤Existing White Balance Controls

iOS 7 이상를 통해 다음과 같은 기존 흰색 균형 컨트롤을 제공 하 고 WhiteBalanceMode 속성:iOS 7 and above provided the following existing White Balance controls via WhiteBalanceMode property:

  • AVCapture WhiteBalance ModeLocked – 한 번 장면 및 장면 전체에서 해당 값을 사용 하 여 샘플링 합니다.AVCapture WhiteBalance ModeLocked – Samples the scene once and using those values throughout the scene.
  • AVCapture WhiteBalance ModeContinuousAutoExposure – 잘 분산 되도록 지속적으로 장면을 샘플입니다.AVCapture WhiteBalance ModeContinuousAutoExposure – Samples the scene continuously to ensure that it is well balanced.

응용 프로그램을 모니터링할 수는 AdjustingWhiteBalance 속성을 노출 조절 될 경우을 참조 하세요.And the application can monitor the AdjustingWhiteBalance property to see when exposure is being adjusted.

IOS 8의에서 새로운 백서 분산 컨트롤New White Balance Controls in iOS 8

이미 이상 iOS 7에서 제공 되는 기능을 하는 것 외에도 다음 기능은 이제 iOS 8에서에서 흰색 분산 컨트롤에서 사용 가능한:In addition to the features already provided by iOS 7 and above, the following features are now available to control White Balance in iOS 8:

  • RGB 장치를 완벽 하 게 수동 제어 권한을 얻습니다.Fully manual control of the device RGB gains.
  • Get, Set, 키-값 관찰 장치 RGB 얻게 됩니다.Get, Set and Key-Value Observe the device RGB gains.
  • 회색 카드를 사용 하 여 흰색 균형을 지원 합니다.Support for White Balance using a Gray Card.
  • 장치 독립 색 공간에서 변환 루틴입니다.Conversion routines to and from device independent color spaces.

위의 기능을 구현 하는 AVCaptureWhiteBalanceGain 구조는 다음과 같은 멤버를 사용 하 여 추가 되었습니다.To implement the above features, the AVCaptureWhiteBalanceGain structure has been added with the following members:

  • RedGain
  • GreenGain
  • BlueGain

최대 흰색 분산 향상 되어 4 개에서 준비할 수 있습니다 하 고는 MaxWhiteBalanceGain 속성입니다.The maximum white balance gain is currently four (4) and can be ready from the MaxWhiteBalanceGain property. 따라서 (1)에서 올바른 범위는 MaxWhiteBalanceGain (4) 현재 합니다.So the legal range is from one (1) to MaxWhiteBalanceGain (4) currently.

DeviceWhiteBalanceGains 속성의 현재 값을 확인에 사용할 수 있습니다.The DeviceWhiteBalanceGains property can be used to observe the current values. 사용 하 여 SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains 균형을 조정 하려면 카메라 잠긴된 흰색 분산 모드에 있을 때 얻습니다.Use SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains to adjust the balance gains when the camera is in the locked white balance mode.

변환 루틴Conversion Routines

IOS 8 to 및 from과으로 변환 하는 데에 변환 루틴을 추가한 장치 독립적인 색 공간입니다.Conversion routines have been added to iOS 8 to help with converting to, and from, device independent color spaces. 변환 루틴을 구현 하는 AVCaptureWhiteBalanceChromaticityValues 구조는 다음과 같은 멤버를 사용 하 여 추가 되었습니다.To implement the conversion routines, the AVCaptureWhiteBalanceChromaticityValues structure has been added with the following members:

  • X -0에서 1 사이의 값입니다.X - is a value from 0 to 1.
  • Y -0에서 1 사이의 값입니다.Y - is a value from 0 to 1.

AVCaptureWhiteBalanceTemperatureAndTintValues 구조는 다음과 같은 멤버를 사용 하 여 추가 되었습니다.An AVCaptureWhiteBalanceTemperatureAndTintValues structure has also been added with the following members:

  • Temperature -부동 소수점 값 켈빈 합니다.Temperature - is a floating point value in degrees Kelvin.
  • Tint -녹색 및 자홍 0에서 150으로 녹색 방향 양수 값을 사용 하 여는 자홍에서 음수 쪽으로 오프셋입니다.Tint - is an offset from green or magenta from 0 to 150 with positive values towards the green direction and negative toward in the magenta.

사용 된 CaptureDevice.GetTemperatureAndTintValuesCaptureDevice.GetDeviceWhiteBalanceGains온도 tint, chromaticity RGB 간의 변환 방법 색 공간을 확보 합니다.Use the CaptureDevice.GetTemperatureAndTintValuesand the CaptureDevice.GetDeviceWhiteBalanceGainsmethods to convert between temperature and tint, chromaticity and RGB gain color spaces.

참고

변환 루틴은 가까울수록 Planckian 궤적 변환할 값이 더 정확 합니다.The conversion routines are more accurate the closer the value to be converted is to the Planckian Locus.

회색 카드 지원Gray Card Support

Apple는 iOS 8에 내장 된 회색 카드 지원 가리키도록 회색 World 용어를 사용 합니다.Apple uses the term Gray World to refer to the Gray Card support built into iOS 8. 사용자를 중심 프레임의 50% 이상에서는를 사용 하는 백서 균형을 조정 하는 실제 회색 카드에 집중할 수 있습니다.It allows the user to focus on a physical Gray Card that covers at least 50% of the center of the frame and uses that to adjust the White Balance. 중립 표시 되는 백서를 달성 하기 위해 회색 카드의 목적은입니다.The purpose of the Gray Card is to achieve white that appears neutral.

이 물리적 회색 카드 카메라 앞에 추가할 사용자에 게 응용 프로그램에서 구현할 수 있습니다 모니터링을 GrayWorldDeviceWhiteBalanceGains 속성과 값 정착 될 때까지 대기 합니다.This can be implemented in an application by prompting the user to place a physical gray card in front of the camera, monitoring the GrayWorldDeviceWhiteBalanceGains property and waiting until the values settle down.

응용 프로그램에 대 한 백서 분산 향상에 잠금이 수행 됩니다는 SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains 메서드는 값을 사용 하는 GrayWorldDeviceWhiteBalanceGains 속성 변경 내용을 적용 합니다.The application would then lock the White Balance gains for the SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains method using the values from the GrayWorldDeviceWhiteBalanceGains property to apply the changes.

흰색 분산 변경 수 있으려면 먼저 구성에 대 한 캡처 장치를 잠가야 합니다.The Capture Device must be locked for configuration before a change in White Balance can be made.

수동 흰색 분산 예제Manual White Balance Example

현재 위치에서 일반 AV 캡처 설치 코드를 사용 하 여를 UIViewController 응용 프로그램의 스토리 보드에 추가할 수 있고 다음과 같이 구성 합니다.With the General AV Capture Setup code in place, a UIViewController can be added to the application's Storyboard and configured as follows:

보기에는 다음 주요 요소가 포함 됩니다.The view contains the following main elements:

  • UIImageView 비디오 피드를 표시 하는 됩니다.A UIImageView that will display the video feed.
  • UISegmentedControl 는 포커스 모드에서 자동으로 바뀝니다 잠금.A UISegmentedControl that will change the Focus Mode from Automatic to Locked.
  • UISlider 표시 되며 온도 및 색조를 업데이트 하는 컨트롤입니다.Two UISlider controls that will show and update the Temperature and Tint.
  • UIButton 회색 카드 (회색 World) 공간 샘플 및 해당 값을 사용 하 여 흰색 분산을 설정 하는 데 사용 합니다.A UIButton used to sample a Gray Card (Gray World) space and set the White Balance using those values.

실시간 접속 뷰 컨트롤러 수동 흰색 분산 제어 하려면 다음을 수행 합니다.Do the following to wire-up the view controller for Manual White Balance Control:

  1. 다음 추가 문을 사용 하 여:Add the following using statements:

    using System;
    using Foundation;
    using UIKit;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Linq;
    using AVFoundation;
    using CoreVideo;
    using CoreMedia;
    using CoreGraphics;
    using CoreFoundation;
    using System.Timers;
    
  2. 다음 private 변수를 추가 합니다.Add the following private variables:

    #region Private Variables
    private NSError Error; 
    private bool Automatic = true;
    #endregion
    
  3. 다음 계산 된 속성을 추가 합니다.Add the following computed properties:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. 새 백서를 설정 하려면 다음 개인 메서드를 추가 온도 및 Tint 균형을 유지 합니다.Add the following private method to set the new white balance Temperature and Tint:

    #region Private Methods
    void SetTemperatureAndTint() {
        // Grab current temp and tint
        var TempAndTint = new AVCaptureWhiteBalanceTemperatureAndTintValues (Temperature.Value, Tint.Value);
    
        // Convert Color space
        var gains = ThisApp.CaptureDevice.GetDeviceWhiteBalanceGains (TempAndTint);
    
        // Set the new values
        if (ThisApp.CaptureDevice.LockForConfiguration (out Error)) {
            gains = NomralizeGains (gains);
            ThisApp.CaptureDevice.SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains (gains, null);
            ThisApp.CaptureDevice.UnlockForConfiguration ();
        }
    }
    
    AVCaptureWhiteBalanceGains NomralizeGains (AVCaptureWhiteBalanceGains gains)
    {
        gains.RedGain = Math.Max (1, gains.RedGain);
        gains.BlueGain = Math.Max (1, gains.BlueGain);
        gains.GreenGain = Math.Max (1, gains.GreenGain);
    
        float maxGain = ThisApp.CaptureDevice.MaxWhiteBalanceGain;
        gains.RedGain = Math.Min (maxGain, gains.RedGain);
        gains.BlueGain = Math.Min (maxGain, gains.BlueGain);
        gains.GreenGain = Math.Min (maxGain, gains.GreenGain);
    
        return gains;
    }
    #endregion
    
  5. 재정의 ViewDidLoad 메서드 다음 코드를 추가 합니다.Override the ViewDidLoad method and add the following code:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
    
        // Hide no camera label
        NoCamera.Hidden = ThisApp.CameraAvailable;
    
        // Attach to camera view
        ThisApp.Recorder.DisplayView = CameraView;
    
        // Set min and max values
        Temperature.MinValue = 1000f;
        Temperature.MaxValue = 10000f;
    
        Tint.MinValue = -150f;
        Tint.MaxValue = 150f;
    
        // Create a timer to monitor and update the UI
        SampleTimer = new Timer (5000);
        SampleTimer.Elapsed += (sender, e) => {
            // Convert color space
            var TempAndTint = ThisApp.CaptureDevice.GetTemperatureAndTintValues (ThisApp.CaptureDevice.DeviceWhiteBalanceGains);
    
            // Update slider positions
            Temperature.BeginInvokeOnMainThread (() => {
                Temperature.Value = TempAndTint.Temperature;
            });
    
            Tint.BeginInvokeOnMainThread (() => {
                Tint.Value = TempAndTint.Tint;
            });
        };
    
        // Watch for value changes
        Segments.ValueChanged += (sender, e) => {
            // Lock device for change
            if (ThisApp.CaptureDevice.LockForConfiguration (out Error)) {
    
                // Take action based on the segment selected
                switch (Segments.SelectedSegment) {
                case 0:
                // Activate auto focus and start monitoring position
                    Temperature.Enabled = false;
                    Tint.Enabled = false;
                    ThisApp.CaptureDevice.WhiteBalanceMode = AVCaptureWhiteBalanceMode.ContinuousAutoWhiteBalance;
                    SampleTimer.Start ();
                    Automatic = true;
                    break;
                case 1:
                // Stop auto focus and allow the user to control the camera
                    SampleTimer.Stop ();
                    ThisApp.CaptureDevice.WhiteBalanceMode = AVCaptureWhiteBalanceMode.Locked;
                    Automatic = false;
                    Temperature.Enabled = true;
                    Tint.Enabled = true;
                    break;
                }
    
                // Unlock device
                ThisApp.CaptureDevice.UnlockForConfiguration ();
            }
        };
    
        // Monitor position changes
        Temperature.TouchUpInside += (sender, e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic)
                return;
    
            // Update white balance
            SetTemperatureAndTint ();
        };
    
        Tint.TouchUpInside += (sender, e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic)
                return;
    
            // Update white balance
            SetTemperatureAndTint ();
        };
    
        GrayCardButton.TouchUpInside += (sender, e) => {
    
            // If we are in the automatic mode, ignore changes
            if (Automatic)
                return;
    
            // Get gray card values
            var gains = ThisApp.CaptureDevice.GrayWorldDeviceWhiteBalanceGains;
    
            // Set the new values
            if (ThisApp.CaptureDevice.LockForConfiguration (out Error)) {
                ThisApp.CaptureDevice.SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains (gains, null);
                ThisApp.CaptureDevice.UnlockForConfiguration ();
            }
        };
    }
    
  6. 재정의 ViewDidAppear 메서드 뷰가 로드 되 면 기록을 시작 하려면 다음을 추가 합니다.Override the ViewDidAppear method and add the following to start recording when the view loads:

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
    
        // Start udating the display
        if (ThisApp.CameraAvailable) {
            // Remap to this camera view
            ThisApp.Recorder.DisplayView = CameraView;
    
            ThisApp.Session.StartRunning ();
            SampleTimer.Start ();
        }
    }
    
  7. 변경 내용을 저장 합니다 코드 및 응용 프로그램을 실행 합니다.Save the changes the to code and run the application.

  8. 자동 모드에서 카메라를 사용 하 여 슬라이더 카메라 흰색 균형을 조정 하는 대로 자동으로 이동 합니다.With the camera in the Auto mode, the sliders will move automatically as the camera adjusts white balance:

  9. 잠금 세그먼트를 탭 하 고 수동으로 흰색 균형을 조정 하려면 Temp 및 Tint 슬라이더를 끌어:Tap the Locked segment and drag the Temp and Tint sliders to adjust the white balance manually:

  10. 여전히 선택한 잠긴 세그먼트를 사용 하 여 카메라의 앞에 물리적 회색 카드 놓고 회색 전 세계에 흰색 균형을 조정 하려면 회색 카드 단추를 탭 합니다.With the Locked segment still selected, place a physical gray card in front of the camera and tap the Gray Card button to adjust white balance to the Gray World:

  11. 응용 프로그램을 중지 합니다.Stop the application.

위의 코드는 카메라 자동 모드에 있을 때 흰색 밸런스 설정이 모니터링 하거나 슬라이더를 사용 하 여 잠금 모드에 있을 때 흰색 균형을 제어 하는 방법을 보여 주었습니다.The above code has shown how to monitor the white balance settings when the camera is in the Automatic mode or use sliders to control the white balance when it is in the Locked mode.

대괄호로 묶은 캡처Bracketed Capture

대괄호로 묶은 캡처 위의 수동 카메라 컨트롤의 설정을 기반으로 하며 응용 프로그램을 잠시 시간 내에 다양 한 방식으로 캡처할 수 있습니다.The Bracketed Capture is based on the settings from the Manual Camera Controls presented above and allows the application to capture a moment in time, in a variety of different ways.

간단히 말해서 다양 한 그림 그림에서 설정이 계속 찍은 폭주는 캡처 대괄호로 묶습니다.Simply stated, Bracketed Capture is a burst of still images taken with a variety of settings from picture to picture.

대괄호로 묶은 캡처를 사용 하 여 ios 8, 응용 프로그램 수 일련의 수동 카메라 컨트롤을 미리 설정, 단일 명령을 실행 있고 현재 장면 수동 사전 설정 중 각각에 대 한 일련의 이미지를 반환 합니다.Using the Bracketed Capture in iOS 8, an application can preset a series of Manual Camera Controls, issue a single command and have the current scene return a series of images for each of the manual presets.

대괄호로 묶은 캡처 기본 사항Bracketed Capture Basics

다시 캡처 대괄호로 묶은 여전히 찍은 사진 그림에서 다양 한 설정을 사용 하 여 폭주는입니다.Again, Bracketed Capture is a burst of still images taken with varied settings from picture to picture. 대괄호로 묶은 캡처의 형식은 다음과 같습니다.The types of Bracketed Capture available are:

  • 노출 괄호를 자동 모든 이미지는 다양 한 바이어스 크기를 해야 하는 위치입니다.Auto Exposure Bracket – where all images have a varied Bias amount.
  • 수동 노출을 대괄호 모든 이미지는 다양 한 셔터 (기간) 및 ISO 있는 – 크기입니다.Manual Exposure Bracket – where all images have a varied Shutter Speed (Duration) and ISO amount.
  • 간단한 버스트 대괄호 – 일련의 빠르게 연속적으로 수행 하는 이미지도 합니다.Simple Burst Bracket – A series of still images taken in rapid succession.

대괄호로 묶은 캡처의 새 제어 iOS 8New Bracketed Capture Controls in iOS 8

모든 캡처 대괄호로 묶은 명령에서 구현 되는 AVCaptureStillImageOutput 클래스입니다.All Bracketed Capture commands are implemented in the AVCaptureStillImageOutput class. 사용 된 CaptureStillImageBracket메서드 설정의 지정 된 배열 사용 하 여 일련의 이미지를 합니다.Use the CaptureStillImageBracketmethod to get a series of images with the given array of settings.

설정을 처리 하려면 두 개의 새 클래스가 구현 되었습니다.Two new classes have been implemented to handle settings:

  • AVCaptureAutoExposureBracketedStillImageSettings – 속성이 하나 ExposureTargetBias는 자동 노출 대괄호에 대 한 바이어스를 설정 하는 데 사용 합니다.AVCaptureAutoExposureBracketedStillImageSettings – It has one property, ExposureTargetBias, used to set the bias for an auto exposure bracket.
  • AVCaptureManual ExposureBracketedStillImageSettings –에 두 개의 속성인 ExposureDurationISO수동 노출 대괄호에 대 한 ISO와 셔터 속도 설정 하는 데 사용 합니다.AVCaptureManual ExposureBracketedStillImageSettings – It has two properties, ExposureDuration and ISO, used to set the shutter speed and ISO for a manual exposure bracket.

대괄호로 묶은 캡처 일과 제어합니다.Bracketed Capture Controls Do's and Don'ts

할 것Do's

다음은 iOS 8에서에서 컨트롤을 대괄호로 묶은 캡처를 사용할 때 수행 되어야 할 사항의 목록입니다.The following is a list of things that should be done when using the Bracketed Capture controls in iOS 8:

  • 호출 하 여 해당 캡처 최악의 상황에 맞는 앱을 준비 합니다 PrepareToCaptureStillImageBracket 메서드.Prepare the app for the worst-case capture situation by calling the PrepareToCaptureStillImageBracket method.
  • 동일한 공유 풀에서 제공 하는 샘플 버퍼 것임을 가정 합니다.Assume that the sample buffers are going to come from the same shared pool.
  • 준비에 대 한 이전 호출에 의해 할당 된 메모리를 해제 하려면 호출 PrepareToCaptureStillImageBracket 다시 보내는 한 개체의 배열입니다.To release the memory that was allocated by a previous prepare call, call PrepareToCaptureStillImageBracket again and send it an array of one object.

하지 말아야 할 사항Don'ts

다음은 iOS 8에서에서 컨트롤을 대괄호로 묶은 캡처를 사용할 때 수행할 수 해야 하는 사항의 목록입니다.The following is a list of things that should not be done when using the Bracketed Capture controls in iOS 8:

  • 단일 캡처에 설정 형식을 대괄호로 묶은 캡처를 혼합 하지 마세요.Don't mix Bracketed Capture settings types in a single capture.
  • 요청 하지 둘 MaxBracketedCaptureStillImageCount 단일 캡처 이미지입니다.Don't request more than MaxBracketedCaptureStillImageCount images in a single capture.

대괄호로 묶은 캡처 세부 정보Bracketed Capture Details

다음 세부 정보를 캡처 대괄호로 묶은 iOS 8에서 작업할 때 고려해 야 취해야 합니다.The following details should be taken into consideration when working with Bracketed Capture in iOS 8:

  • 대괄호로 묶은 설정을 일시적으로 재정의 된 AVCaptureDevice 설정 합니다.Bracketed settings temporarily override the AVCaptureDevice settings.
  • Flash 및 여전히 이미지 안정화 설정은 무시 됩니다.Flash and still image stabilization settings are ignored.
  • 모든 이미지는 동일한 출력 형식 (예: jpeg, png)을 사용 해야 합니다.All images must use the same output format (jpeg, png, etc.)
  • 비디오 미리 보기 프레임을 삭제할 수 있습니다.Video preview may drop frames.
  • 대괄호로 묶은 캡처는 iOS 8과 호환 되는 모든 장치에서 지원 됩니다.Bracketed Capture is supported on all devices compatible with iOS 8.

이 정보를 염두에서를 사용 하 여 iOS 8에에서 대괄호로 묶은 캡처를 사용 하는 예제를 살펴보겠습니다.With this information in mind, let's take a look at an example of using Bracketed Capture in iOS 8.

괄호 캡처 예제Bracket Capture Example

현재 위치에서 일반 AV 캡처 설치 코드를 사용 하 여를 UIViewController 응용 프로그램의 스토리 보드에 추가할 수 있고 다음과 같이 구성 합니다.With the General AV Capture Setup code in place, a UIViewController can be added to the application's Storyboard and configured as follows:

보기에는 다음 주요 요소가 포함 됩니다.The view contains the following main elements:

  • UIImageView 비디오 피드를 표시 하는 됩니다.A UIImageView that will display the video feed.
  • 세 가지 UIImageViews 는 캡처의 결과 표시 합니다.Three UIImageViews that will display the results of the capture.
  • UIScrollView 비디오 피드 및 결과 뷰를 수용 하도록 합니다.A UIScrollView to house the video feed and result views.
  • UIButton 미리 설정 된 일부 설정을 사용 하 여 대괄호로 묶은 캡처를 만드는 데 사용 합니다.A UIButton used to take a Bracketed Capture with some preset settings.

선 위로 뷰 컨트롤러 캡처용으로 대괄호로 묶은 다음을 수행 합니다.Do the following to wire-up the view controller for Bracketed Capture:

  1. 다음 추가 문을 사용 하 여:Add the following using statements:

    using System;
    using System.Drawing;
    using Foundation;
    using UIKit;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Linq;
    using AVFoundation;
    using CoreVideo;
    using CoreMedia;
    using CoreGraphics;
    using CoreFoundation;
    using CoreImage;
    
  2. 다음 private 변수를 추가 합니다.Add the following private variables:

    #region Private Variables
    private NSError Error;
    private List<UIImageView> Output = new List<UIImageView>();
    private nint OutputIndex = 0;
    #endregion
    
  3. 다음 계산 된 속성을 추가 합니다.Add the following computed properties:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    #endregion
    
  4. 필요한 출력 이미지 뷰 작성 하는 다음 개인 메서드를 추가 합니다.Add the following private method to build the required output image views:

    #region Private Methods
    private UIImageView BuildOutputView(nint n) {
    
        // Create a new image view controller
        var imageView = new UIImageView (new CGRect (CameraView.Frame.Width * n, 0, CameraView.Frame.Width, CameraView.Frame.Height));
    
        // Load a temp image
        imageView.Image = UIImage.FromFile ("Default-568h@2x.png");
    
        // Add a label
        UILabel label = new UILabel (new CGRect (0, 20, CameraView.Frame.Width, 24));
        label.TextColor = UIColor.White;
        label.Text = string.Format ("Bracketed Image {0}", n);
        imageView.AddSubview (label);
    
        // Add to scrolling view
        ScrollView.AddSubview (imageView);
    
        // Return new image view
        return imageView;
    }
    #endregion
    
  5. 재정의 ViewDidLoad 메서드 다음 코드를 추가 합니다.Override the ViewDidLoad method and add the following code:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
    
        // Hide no camera label
        NoCamera.Hidden = ThisApp.CameraAvailable;
    
        // Attach to camera view
        ThisApp.Recorder.DisplayView = CameraView;
    
        // Setup scrolling area
        ScrollView.ContentSize = new SizeF (CameraView.Frame.Width * 4, CameraView.Frame.Height);
    
        // Add output views
        Output.Add (BuildOutputView (1));
        Output.Add (BuildOutputView (2));
        Output.Add (BuildOutputView (3));
    
        // Create preset settings
        var Settings = new AVCaptureBracketedStillImageSettings[] {
            AVCaptureAutoExposureBracketedStillImageSettings.Create(-2.0f),
            AVCaptureAutoExposureBracketedStillImageSettings.Create(0.0f),
            AVCaptureAutoExposureBracketedStillImageSettings.Create(2.0f)
        };
    
        // Wireup capture button
        CaptureButton.TouchUpInside += (sender, e) => {
            // Reset output index
            OutputIndex = 0;
    
            // Tell the camera that we are getting ready to do a bracketed capture
            ThisApp.StillImageOutput.PrepareToCaptureStillImageBracket(ThisApp.StillImageOutput.Connections[0],Settings,async (bool ready, NSError err) => {
                // Was there an error, if so report it
                if (err!=null) {
                    Console.WriteLine("Error: {0}",err.LocalizedDescription);
                }
            });
    
            // Ask the camera to snap a bracketed capture
            ThisApp.StillImageOutput.CaptureStillImageBracket(ThisApp.StillImageOutput.Connections[0],Settings, (sampleBuffer, settings, err) =>{
                // Convert raw image stream into a Core Image Image
                var imageData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer);
                var image = CIImage.FromData(imageData);
    
                // Display the resulting image
                Output[OutputIndex++].Image = UIImage.FromImage(image);
    
                // IMPORTANT: You must release the buffer because AVFoundation has a fixed number
                // of buffers and will stop delivering frames if it runs out.
                sampleBuffer.Dispose();
            });
        };
    }
    
  6. 재정의 ViewDidAppear 메서드 다음 코드를 추가 합니다.Override the ViewDidAppear method and add the following code:

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
    
        // Start udating the display
        if (ThisApp.CameraAvailable) {
            // Remap to this camera view
            ThisApp.Recorder.DisplayView = CameraView;
    
            ThisApp.Session.StartRunning ();
        }
    }
    
    
  7. 변경 내용을 저장 합니다 코드 및 응용 프로그램을 실행 합니다.Save the changes the to code and run the application.

  8. 프레임 장면 및 괄호 캡처 단추를 탭 합니다.Frame a scene and tap the Capture Bracket button:

  9. 오른쪽에서 왼쪽으로 대괄호로 묶은 캡처에 의해 수행 된 세 개의 이미지를 보려면 살짝 밉니다.Swipe right to left to see the three images taken by the Bracketed Capture:

  10. 응용 프로그램을 중지 합니다.Stop the application.

위의 코드를 구성 하 고 iOS 8에는 자동 노출을 대괄호로 묶은 캡처를 수행 하는 방법을 보여 주었습니다.The above code has shown how to configure and take an Auto Exposure Bracketed Capture in iOS 8.

요약Summary

이 문서의 iOS 8에서 제공 하는 새 수동 카메라 컨트롤에 간략하게 설명 하 고 수행할 작업 및 작동 하는 방법의 기본을 다루었습니다.In this article we have covered an introduction to the new Manual Camera Controls provided by iOS 8 and covered the basics of what they do and how they work. 수동 포커스, 수동 노출 및 수동 흰색 잔액 예가 지정 합니다.We have given examples of Manual Focus, Manual Exposure and Manual White Balance. 예를 대괄호로 묶은 캡처 설명한 수동 카메라 컨트롤을 사용 하 여 수행 했던 마지막으로,Finally, we gave an example taking a Bracketed Capture using the previously discussed Manual Camera Controls