Aracılığıyla paylaş


Xamarin.iOS'ta El İle Kamera Denetimleri

iOS 8'de tarafından AVFoundation Framework sağlanan El ile Kamera Denetimleri, bir mobil uygulamanın bir iOS cihazının kamerası üzerinde tam denetim sahibi olmasını sağlar. Bu ayrıntılı kontrol düzeyi, profesyonel düzeyde kamera uygulamaları oluşturmak ve hareketsiz bir görüntü veya video çekerken kameranın parametrelerini ince ayarlayarak sanatçı kompozisyonları sağlamak için kullanılabilir.

Bu denetimler, sonuçların görüntünün doğruluğuna veya güzelliğine daha az uygun olduğu ve alınan görüntünün bazı özelliğini veya öğesini vurgulamak için daha fazla dişli olduğu bilimsel veya endüstriyel uygulamalar geliştirirken de yararlı olabilir.

AVFoundation Yakalama Nesneleri

Bir iOS cihazında kamerayı kullanarak video veya hareketsiz görüntü çekme işlemleri, bu görüntüleri yakalamak için kullanılan işlem büyük ölçüde aynıdır. Bu, varsayılan otomatik kamera denetimlerini kullanan uygulamalar veya yeni El ile Kamera Denetimlerinden yararlanan uygulamalar için geçerlidir:

AVFoundation Capture Objects'e genel bakış

Giriş, yoluyla bir AVCaptureDeviceInput öğesinden içine AVCaptureSession AVCaptureConnectionalınır. Sonuç, hareketsiz görüntü olarak veya video akışı olarak çıkıştır. İşlemin tamamı bir AVCaptureDevicetarafından denetlenilir.

El ile Sağlanan Denetimler

iOS 8 tarafından sağlanan yeni API'leri kullanarak uygulama aşağıdaki kamera özelliklerinin denetimini alabilir:

  • El ile Odak – Son kullanıcının odağın denetimini doğrudan almasına izin vererek, bir uygulama çekilen görüntü üzerinde daha fazla denetim sağlayabilir.
  • El ile Maruz Kalma – Bir uygulama, pozlama üzerinde el ile kontrol sağlayarak kullanıcılara daha fazla özgürlük sağlayabilir ve stilize bir görünüm elde etmelerini sağlayabilir.
  • El ile Beyaz Dengesi – Beyaz Dengesi, bir görüntüdeki rengi ayarlamak için kullanılır; genellikle gerçekçi görünmesini sağlar. Farklı ışık kaynakları farklı renk sıcaklıklarına sahiptir ve görüntü yakalamak için kullanılan kamera ayarları bu farkları telafi edecek şekilde ayarlanır. Kullanıcılar, beyaz dengesi üzerinde kullanıcı denetimine izin vererek otomatik olarak yapılamayan ayarlamalar yapabilir.

iOS 8, görüntü yakalama işlemi üzerinde bu ayrıntılı denetimi sağlamak için mevcut iOS API'lerinde uzantılar ve geliştirmeler sağlar.

Gereksinimler

Bu makalede sunulan adımları tamamlamak için aşağıdakiler gereklidir:

  • Xcode 7+ ve iOS 8 veya üzeri – Apple'ın Xcode 7 ve iOS 8 veya daha yeni API'lerinin geliştiricinin bilgisayarına yüklenmesi ve yapılandırılması gerekir.
  • Mac için Visual Studio – Mac için Visual Studio en son sürümü kullanıcı cihazında yüklenip yapılandırılmalıdır.
  • iOS 8 Cihazı – iOS 8'in en son sürümünü çalıştıran bir iOS cihazı. Kamera özellikleri iOS Simülatörü'nde test edilemez.

Genel AV Yakalama Kurulumu

Bir iOS cihazında video kaydederken, her zaman gerekli olan bazı genel kurulum kodları vardır. Bu bölümde, iOS cihazının kamerasından video kaydetmek ve bu videoyu bir UIImageViewiçinde gerçek zamanlı olarak görüntülemek için gereken minimum kurulum ele alınacaktır.

Çıkış Örneği Arabellek Temsilcisi

gerekli ilk şeylerden biri, Örnek Çıkış arabelleği izlemek ve arabellekten uygulama kullanıcı arabiriminde bir görüntü görüntülemek için bir UIImageView temsilci olacaktır.

Aşağıdaki yordam Örnek Arabelleği izler ve kullanıcı arabirimini güncelleştirir:

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
    }
}

Bu yordam uygulandığında, AppDelegate canlı video akışı kaydetmek için BIR AV Yakalama Oturumu açmak için değiştirilebilir.

AV Yakalama Oturumu Oluşturma

AV Capture oturumu, iOS Cihazının kamerasından canlı video kaydını denetlemek için kullanılır ve bir iOS uygulamasına video almak için gereklidir. Örnek ManualCameraControl uygulama yakalama oturumunu birkaç farklı yerde kullandığından, içinde yapılandırılır AppDelegate ve uygulamanın tamamında kullanılabilir hale getirilir.

Uygulamanın AppDelegate kodunu değiştirmek ve gerekli kodu eklemek için aşağıdakileri yapın:

  1. Düzenlemek üzere açmak için Çözüm Gezgini dosyaya çift tıklayınAppDelegate.cs.

  2. Aşağıdaki using deyimlerini dosyasının üst tarafına ekleyin:

    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. Sınıfına aşağıdaki özel değişkenleri ve hesaplanan özellikleri AppDelegate ekleyin:

    #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. Tamamlanmış yöntemi geçersiz kılın ve şu şekilde değiştirin:

    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. Dosyadaki değişiklikleri kaydedin.

Bu kod uygulandığında, El ile Kamera Denetimleri deneme ve test için kolayca uygulanabilir.

El ile Odak

Bir uygulama, son kullanıcının odağın denetimlerini doğrudan almasına izin vererek, alınan görüntü üzerinde daha artistik denetim sağlayabilir.

Örneğin, profesyonel bir fotoğrafçı Bokeh Efekti elde etmek için bir görüntünün odağını yumuşatabilir. Veya odak çekme efekti oluşturun.

Bilim adamları veya tıbbi uygulamalar yazarı için uygulama, deneyler için merceği program aracılığıyla hareket ettirmek isteyebilir. Her iki şekilde de yeni API, son kullanıcının veya uygulamanın görüntünün çekildiği anda odak üzerinde denetim sahibi olmasını sağlar.

Odak Nasıl Çalışır?

Bir IOS 8 uygulamasında odağı denetlemenin ayrıntılarını tartışmadan önce. Şimdi bir iOS cihazında odağın nasıl çalıştığına hızlıca göz atalım:

iOS cihazında odak nasıl çalışır?

Işık, iOS cihazında kamera lensine girer ve bir görüntü sensörüne odaklanır. Lensin sensörden uzaklığı, Odak Noktasının (görüntünün en keskin görüneceği alan) sensörle ilişkili olarak nerede olduğunu denetler. Lens sensörden ne kadar uzaktaysa, uzaklık nesneleri en keskin ve yakın, yakın nesneler en keskin görünür.

Bir iOS cihazında lens mıknatıslar ve yaylar ile sensöre daha yakın veya daha uzağa taşınır. Sonuç olarak, cihazdan cihaza değişeceği için lensin tam olarak konumlandırılması imkansızdır ve cihazın yönü veya cihazın yaşı ve yay gibi parametrelerden etkilenebilir.

Önemli Odak Koşulları

Odaklanmayla ilgilenirken, geliştiricinin tanıması gereken birkaç terim vardır:

  • Alan Derinliği – Odaktaki en yakın ve en uzak nesneler arasındaki uzaklık.
  • Makro - Odak spektrumunun yakın ucudur ve merceğin odaklanabileceği en yakın mesafedir.
  • Sonsuzluk – Bu odak spektrumunun uzak ucudur ve lensin odaklanabileceği en uzak mesafedir.
  • Hiper Odak Uzaklığı – Odak spektrumunda, karedeki en uzak nesnenin odağın en ucunda olduğu noktadır. Başka bir deyişle, alan derinliğini en üst düzeye çıkaran odak konumudur.
  • Lens Konumu – Yukarıdaki diğer terimlerin tümünü bu şekilde denetler. Bu, lensin sensörden uzaklığı ve böylece odak denetleyicisidir.

Bu terimler ve bilgiler göz önünde bulundurularak, yeni El ile Odak Denetimleri bir iOS 8 uygulamasında başarıyla uygulanabilir.

Mevcut Odak Denetimleri

iOS 7 ve önceki sürümler, özellik aracılığıyla FocusModemevcut Odak Denetimleri'nin şu şekilde sağlanmasını sağladı:

  • AVCaptureFocusModeLocked – Odak tek bir odak noktasında kilitlenir.
  • AVCaptureFocusModeAutoFocus – Kamera, net bir odak bulana kadar lensi tüm odak noktalarında tarar ve orada kalır.
  • AVCaptureFocusModeContinuousAutoFocus – Kamera, odak dışı bir koşul algılasa yeniden odaklanıyor.

Mevcut denetimler ayrıca özellik aracılığıylaFocusPointOfInterest ayarlanabilir bir ilgi noktası sağladı, böylece kullanıcı belirli bir alana odaklanmak için dokunabiliyordu. Uygulama, özelliği izleyerek lens hareketini de izleyebilir IsAdjustingFocus .

Ayrıca, özellik tarafından aralık kısıtlaması AutoFocusRangeRestriction şu şekilde sağlanmıştır:

  • AVCaptureAutoFocusRangeRestrictionNear – Otomatik odaklanmayı yakındaki derinliklerle kısıtlar. QR Kodu veya barkod tarama gibi durumlarda kullanışlıdır.
  • AVCaptureAutoFocusRangeRestrictionFar – Otomatik odaklanmayı uzak derinliklerle kısıtlar. Ilgisiz olduğu bilinen nesnelerin görünüm alanında (örneğin, bir pencere çerçevesi) bulunduğu durumlarda kullanışlıdır.

Son olarak, video kaydederken yapıtların taşınmasını önlemek için otomatik odak algoritmasını yavaşlatan ve daha küçük artışlarla ilerleten özellik vardır SmoothAutoFocus .

iOS 8'de Yeni Odak Denetimleri

iOS 7 ve üzeri tarafından sağlanan özelliklere ek olarak, iOS 8'de odağı denetlemek için aşağıdaki özellikler artık kullanılabilir:

  • Odağı kilitlerken mercek konumunun tam el ile kontrolü.
  • Herhangi bir odak modunda lens konumunun anahtar-değer gözlemi.

Yukarıdaki özellikleri uygulamak için, AVCaptureDevice sınıfı kamera lensinin geçerli konumunu almak için kullanılan salt LensPosition okunur özelliği içerecek şekilde değiştirilmiştir.

Mercek Konumunu el ile kontrol etmek için Yakalama Cihazının Kilitli Odak Modunda olması gerekir. Örnek:

CaptureDevice.FocusMode = AVCaptureFocusMode.Locked;

SetFocusModeLocked Kamera lensinin konumunu ayarlamak için Yakalama Cihazı yöntemi kullanılır. Değişiklik etkin olduğunda bildirim almak için isteğe bağlı bir geri çağırma yordamı sağlanabilir. Örnek:

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

Yukarıdaki kodda görüldüğü gibi, Lens Konumu'nda bir değişiklik yapılabilmesi için önce Yakalama Cihazının yapılandırmaya karşı kilitlenmesi gerekir. Geçerli Mercek Konumu değerleri 0,0 ile 1,0 arasındadır.

El ile Odak Örneği

Genel AV Yakalama Kurulumu kodu uygulandığında, UIViewController uygulamanın Görsel Taslak'a eklenebilir ve aşağıdaki gibi yapılandırılabilir:

UiViewController, uygulamalara Görsel Taslak'a eklenebilir ve el ile odak örneği için burada gösterildiği gibi yapılandırılabilir.

Görünüm aşağıdaki ana öğeleri içerir:

  • UIImageView Video akışının görüntüleneceği bir.
  • UISegmentedControl Odak Modu'nu Otomatik olan Kilitli olarak değiştirecek bir.
  • UISlider Geçerli Lens Konumunu gösterecek ve güncelleştirecek bir.

El ile Odak Denetimi için görünüm denetleyicisini bağlamak için aşağıdakileri yapın:

  1. Deyimleri kullanarak aşağıdakileri ekleyin:

    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. Aşağıdaki özel değişkenleri ekleyin:

    #region Private Variables
    private NSError Error;
    private bool Automatic = true;
    #endregion
    
  3. Aşağıdaki hesaplanan özellikleri ekleyin:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. ViewDidLoad yöntemini geçersiz kılın ve aşağıdaki kodu ekleyin:

    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 Yöntemini geçersiz kılın ve görünüm yüklendiğinde kaydı başlatmak için aşağıdakileri ekleyin:

    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. Kamera Otomatik modda olduğundan, kamera odağı ayarladıkça kaydırıcı otomatik olarak hareket eder:

    Kamera bu örnek uygulamada odağı ayarladıkça kaydırıcı otomatik olarak hareket eder

  7. Kilitli segmente dokunun ve mercek konumunu el ile ayarlamak için konum kaydırıcısını sürükleyin:

    Mercek konumunu el ile ayarlama

  8. Uygulamayı durdurun.

Yukarıdaki kod, kamera Otomatik moddayken lens konumunun nasıl izleneceğini veya Kilitli moddayken lens konumunu kontrol etmek için bir kaydırıcının nasıl kullanılacağını göstermiştir.

El ile Maruz Kalma

Pozlama, görüntünün kaynak parlaklığına göre parlaklığını ifade eder ve sensöre ne kadar ışık isabet ettiği, ne kadar süreyle ve algılayıcının kazanç düzeyine (ISO eşlemesi) göre belirlenir. Bir uygulama, maruz kalma üzerinde el ile denetim sağlayarak son kullanıcıya daha fazla özgürlük sağlayabilir ve stilize bir görünüm elde etmelerini sağlayabilir.

Kullanıcı, El ile Pozlama Denetimlerini kullanarak, olağanüstü derecede parlak olandan koyu ve moody'ye kadar bir görüntü alabilir:

Olağanüstü derecede parlak olandan koyu ve karanlığa maruz kalma durumunu gösteren örnek bir görüntü

Bu da bilimsel uygulamalar için programlı denetim kullanılarak veya uygulamaların kullanıcı arabirimi tarafından sağlanan el ile denetimler aracılığıyla otomatik olarak yapılabilir. Her iki durumda da, yeni iOS 8 Pozlama API'leri kameranın pozlama ayarları üzerinde ayrıntılı denetim sağlar.

Pozlama Nasıl Çalışır?

IOS 8 uygulamasında pozlamayı denetlemenin ayrıntılarını tartışmadan önce. Şimdi pozlamanın nasıl çalıştığına hızlıca göz atalım:

Pozlama nasıl çalışır?

Pozlamayı kontrol etmek için bir araya gelen üç temel öğe şunlardır:

  • Deklanşör Hızı – Bu, fotoğraf makinesi sensörüne ışık bırakmak için deklanşörün açık olduğu süredir. Deklanşör ne kadar kısa olursa, o kadar az ışık içeri alınır ve görüntü o kadar net olur (daha az hareket bulanıklığı). Deklanşör ne kadar uzun süre açık olursa, o kadar fazla ışık içeri ve daha fazla hareket bulanıklığı oluşur.
  • ISO Haritalama – Bu, film fotoğrafçılığından alınan bir terimdir ve filmdeki kimyasalların ışığa duyarlılığını ifade eder. Filmdeki düşük ISO değerleri daha az taneli ve daha ince renk üretimine sahiptir; dijital sensörlerdeki düşük ISO değerleri daha az sensör gürültüsüne ama daha az parlaklığa sahiptir. ISO değeri ne kadar yüksek olursa görüntü o kadar parlak olur ancak daha fazla sensör gürültüsü olur. Dijital sensördeki "ISO", fiziksel bir özellik değil, elektronik kazanç ölçüsüdür.
  • Lens Açıklığı – Bu, lens açma boyutunu gösterir. Tüm iOS cihazlarda lens diyaframı sabittir, bu nedenle pozlamayı ayarlamak için kullanılabilecek tek iki değer Deklanşör Hızı ve ISO'dur.

Sürekli Otomatik Pozlama Nasıl Çalışır?

El ile pozlamanın nasıl çalıştığını öğrenmeden önce, iOS cihazında sürekli otomatik pozlamanın nasıl çalıştığını anlamak iyi bir fikirdir.

iOS cihazında sürekli otomatik pozlama nasıl çalışır?

İlk olarak Otomatik Pozlama Bloğu, ideal pozlamayı hesaplama görevine sahiptir ve sürekli Ölçüm İstatistikleri ile beslenmektedir. Sahneyi iyi aydınlatabilmek için iso ve deklanşör hızının en uygun karışımını hesaplamak için bu bilgileri kullanır. Bu döngü AE Döngüsü olarak adlandırılır.

Kilitli Pozlama Nasıl Çalışır?

Şimdi iOS cihazlarında kilitli pozlamanın nasıl çalıştığını inceleyelim.

iOS cihazlarında kilitli pozlama nasıl çalışır?

Yine, en uygun iOS ve Süre değerlerini hesaplamaya çalışan Otomatik Pozlama Bloğuna sahipsiniz. Ancak bu modda AE Bloğunun Ölçüm İstatistikleri altyapısıyla bağlantısı kesilir.

Mevcut Pozlama Denetimleri

iOS 7 ve üzeri, özelliği aracılığıyla aşağıdaki mevcut Pozlama denetimlerini ExposureMode sağlayın:

  • AVCaptureExposureModeLocked – Sahneyi bir kez örnekler ve bu değerleri sahne boyunca kullanır.
  • AVCaptureExposureModeContinuousAutoExposure – İyi aydınlatıldığından emin olmak için sahneyi sürekli örnekler.

ExposurePointOfInterest, kullanıma sunulacak hedef nesneyi seçerek sahneyi kullanıma açmak için dokunabilir ve uygulama, pozlamanın AdjustingExposure ne zaman ayarlandığını görmek için özelliği izleyebilir.

iOS 8'de Yeni Pozlama Denetimleri

iOS 7 ve üzeri tarafından sağlanan özelliklere ek olarak, iOS 8'de pozlamayı denetlemek için aşağıdaki özellikler artık kullanılabilir:

  • Tamamen el ile özel pozlama.
  • IOS ve Deklanşör Hızını (Süre) Alma, Ayarlama ve Anahtar-Değer Gözlemleme.

Yukarıdaki özellikleri uygulamak için yeni AVCaptureExposureModeCustom bir mod eklendi. Içindeki kamera özel moddayken, Pozlama Süresi ve ISO ayarlarını yapmak için aşağıdaki kod kullanılabilir:

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

Otomatik ve Kilitli modlarında uygulama, aşağıdaki kodu kullanarak otomatik pozlama yordamının yanlılıklarını ayarlayabilir:

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

Minimum ve maksimum ayar aralıkları, uygulamanın üzerinde çalıştığı cihaza bağlıdır, bu nedenle hiçbir zaman sabit kodlanmamalıdır. Bunun yerine, en düşük ve en yüksek değer aralıklarını almak için aşağıdaki özellikleri kullanın:

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

Yukarıdaki kodda görüldüğü gibi, pozlamada değişiklik yapılabilmesi için önce Yakalama Cihazının yapılandırmaya karşı kilitlenmesi gerekir.

El ile Maruz Kalma Örneği

Genel AV Yakalama Kurulumu kodu uygulandığında, UIViewController uygulamanın Görsel Taslak'a eklenebilir ve aşağıdaki gibi yapılandırılabilir:

UiViewController, uygulamalara Görsel Taslak'a eklenebilir ve el ile kullanıma açma örneği için burada gösterildiği gibi yapılandırılabilir.

Görünüm aşağıdaki ana öğeleri içerir:

  • UIImageView Video akışının görüntüleneceği bir.
  • UISegmentedControl Odak Modu'nu Otomatik olan Kilitli olarak değiştirecek bir.
  • Uzaklık, Süre, ISO ve Sapma değerlerini gösterecek ve güncelleştirecek dört UISlider denetim.

El ile Pozlama Denetimi için görünüm denetleyicisini bağlamak için aşağıdakileri yapın:

  1. Deyimleri kullanarak aşağıdakileri ekleyin:

    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. Aşağıdaki özel değişkenleri ekleyin:

    #region Private Variables
    private NSError Error;
    private bool Automatic = true;
    private nfloat ExposureDurationPower = 5;
    private nfloat ExposureMinimumDuration = 1.0f/1000.0f;
    #endregion
    
  3. Aşağıdaki hesaplanan özellikleri ekleyin:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. ViewDidLoad yöntemini geçersiz kılın ve aşağıdaki kodu ekleyin:

    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 Yöntemini geçersiz kılın ve görünüm yüklendiğinde kaydı başlatmak için aşağıdakileri ekleyin:

    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. Kamera Otomatik modda olduğundan, kamera pozlamayı ayarladıkça kaydırıcılar otomatik olarak hareket eder:

    Kamera pozlamayı ayarladıkça kaydırıcılar otomatik olarak hareket eder

  7. Otomatik pozlamanın sapmasını el ile ayarlamak için Kilitli segmente dokunun ve Sapma kaydırıcısını sürükleyin:

    Otomatik pozlamanın sapmasını el ile ayarlama

  8. Özel segmente dokunun ve pozlamayı el ile denetlemek için Süre ve ISO kaydırıcılarını sürükleyin:

    Pozlamayı el ile denetlemek için Süre ve ISO kaydırıcılarını sürükleyin

  9. Uygulamayı durdurun.

Yukarıdaki kod, kamera Otomatik moddayken pozlama ayarlarının nasıl izleneceğini ve Kilitli veya Özel modlardayken pozlamayı denetlemek için kaydırıcıların nasıl kullanılacağını göstermiştir.

El ile Beyaz Dengesi

Beyaz Dengesi denetimleri, kullanıcıların daha gerçekçi görünmelerini sağlamak için bir görüntüdeki harmanlamanın dengesini ayarlamasına olanak sağlar. Farklı ışık kaynaklarının farklı renk sıcaklıkları vardır ve bir görüntüyü yakalamak için kullanılan kamera ayarları bu farkları telafi etmek için ayarlanmalıdır. Yine, beyaz dengesi üzerinde kullanıcı denetimine izin vererek, otomatik rutinlerin artistik efektler elde etmek için yetersiz olduğu profesyonel ayarlamalar yapabilir.

El ile Beyaz Dengesi ayarlamalarını gösteren örnek görüntü

Örneğin, gün ışığı mavimsi bir döküme sahipken, tungsten akkor ışıklarda daha sıcak, sarı-turuncu bir ton vardır. (Kafa karıştırıcı bir şekilde, "cool" renklerin renk sıcaklıkları "sıcak" renklerden daha yüksektir. Renk sıcaklıkları algısal bir ölçü değil fiziksel bir ölçüdür.)

İnsan zihni renk sıcaklığındaki farkları telafi etmede çok iyidir, ancak bu bir kameranın yapamayacağı bir şeydir. Kamera, renk farklılıklarını ayarlamak için karşıt spektrumdaki rengi artırarak çalışır.

Yeni iOS 8 Pozlama API'si, uygulamanın işlemin denetimini almasına ve kameranın beyaz dengesi ayarları üzerinde ayrıntılı denetim sağlamasına olanak tanır.

Beyaz Dengesi Nasıl Çalışır?

IOS 8 uygulamasında beyaz dengesini denetlemenin ayrıntılarını tartışmadan önce. Şimdi beyaz dengesinin nasıl çalıştığına göz atalım:

Renk algısı çalışmasında CIE 1931 RGB renk alanı ve CIE 1931 XYZ renk uzayı matematiksel olarak tanımlanan ilk renk alanlarıdır. 1931 yılında Uluslararası Aydınlatma Komisyonu (CIE) tarafından oluşturulmuştur.

CIE 1931 RGB renk alanı ve CIE 1931 XYZ renk alanı

Yukarıdaki grafikte, derin maviden parlak yeşile ve parlak kırmızıya kadar insan gözüne görünen tüm renkler gösterilmektedir. Yukarıdaki grafikte gösterildiği gibi diyagramdaki herhangi bir nokta X ve Y değeriyle çizilebilir.

Grafikte göründüğü gibi, graf üzerinde insan görüş aralığının dışında olacak şekilde çizilebilen X ve Y değerleri vardır ve sonuç olarak bu renkler bir kamera tarafından yeniden oluşturulamaz.

Yukarıdaki grafikteki daha küçük eğriye, renk sıcaklığını (kelvin cinsinden) ifade eden Planckian Locus, mavi tarafında daha yüksek sayılar (daha sıcak) ve kırmızı tarafta daha düşük sayılar (soğutucu) denir. Bunlar tipik aydınlatma durumlarında kullanışlıdır.

Karma aydınlatma koşullarında, gerekli değişiklikleri yapmak için beyaz dengesi ayarlamalarının Planckian Locus'tan sapması gerekir. Bu durumlarda ayarlamanın CIE ölçeğinin yeşil veya kırmızı/eflatun tarafına kaydırılması gerekir.

iOS Cihazları, karşıt renk kazancını artırarak renk türlerini telafi eder. Örneğin, bir sahne çok fazla maviyse, kırmızı kazanç telafi etmek için artırılır. Bu kazanç değerleri belirli cihazlar için ayarlı olduğundan cihaza bağımlıdır.

Mevcut Beyaz Bakiye Denetimleri

iOS 7 ve üzeri, özellik aracılığıyla WhiteBalanceMode aşağıdaki mevcut Beyaz Denge denetimlerini sağladı:

  • AVCapture WhiteBalance ModeLocked – Sahneyi bir kez örnekler ve bu değerleri sahnenin tamamında kullanır.
  • AVCapture WhiteBalance ModeContinuousAutoExposure – İyi dengelendiğinden emin olmak için sahneyi sürekli örnekler.

Uygulama, pozlamanın AdjustingWhiteBalance ne zaman ayarlandığını görmek için özelliği izleyebilir.

iOS 8'de Yeni Beyaz Dengesi Denetimleri

iOS 7 ve üzeri tarafından sağlanan özelliklere ek olarak, iOS 8'de White Balance'ı denetlemek için aşağıdaki özellikler artık kullanılabilir:

  • Cihaz RGB kazançlarının tamamen el ile kontrolü.
  • Get, Set ve Key-Value Cihaz RGB kazançlarını gözlemleyin.
  • Gri Kart kullanarak Beyaz Bakiye desteği.
  • Cihazdan bağımsız renk alanlarına dönüştürme yordamları.

Yukarıdaki özellikleri uygulamak için yapı AVCaptureWhiteBalanceGain aşağıdaki üyelerle eklenmiştir:

  • RedGain
  • GreenGain
  • BlueGain

Maksimum beyaz dengesi kazancı şu anda dört (4) ve özelliğinden MaxWhiteBalanceGain hazır olabilir. Bu nedenle yasal aralık şu anda bir (1) ile MaxWhiteBalanceGain (4) arasındadır.

DeviceWhiteBalanceGains özelliği geçerli değerleri gözlemlemek için kullanılabilir. Kamera kilitli beyaz dengesi modundayken denge kazançlarını ayarlamak için kullanın SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains .

Dönüştürme Yordamları

Cihazdan bağımsız renk alanlarına dönüştürmeye ve cihazdan bağımsız renk alanlarına dönüştürmeye yardımcı olmak için iOS 8'e dönüştürme yordamları eklenmiştir. Dönüştürme yordamlarını uygulamak için yapı AVCaptureWhiteBalanceChromaticityValues aşağıdaki üyelerle eklenmiştir:

  • X - 0 ile 1 arası bir değerdir.
  • Y - 0 ile 1 arası bir değerdir.

Aşağıdaki üyelere sahip bir AVCaptureWhiteBalanceTemperatureAndTintValues yapı da eklenmiştir:

  • Temperature - Kelvin derecesinde kayan nokta değeridir.
  • Tint - yeşil veya eflatundan 0 ile 150 arasında bir uzaklıktır ve pozitif değerler yeşil yönde ve negatif eflatun içindedir.

CaptureDevice.GetTemperatureAndTintValuesSıcaklık ve renk tonuCaptureDevice.GetDeviceWhiteBalanceGains, kromatisite ve RGB kazanç renk alanları arasında dönüştürmek için ve yöntemlerini kullanın.

Not

Dönüştürme yordamları, dönüştürülecek değer Planckian Locus'a ne kadar yakınsa o kadar doğrudur.

Gri Kart Desteği

Apple, iOS 8'de yerleşik olarak bulunan Gri Kart desteğine başvurmak için Gri Dünya terimini kullanır. Kullanıcının çerçevenin merkezinin en az %50'sini kapsayan ve Beyaz Denge'yi ayarlamak için bunu kullanan fiziksel bir Gri Karta odaklanmasını sağlar. Gri Kartın amacı nötr görünen beyazı elde etmektir.

Bu, kullanıcıdan kameranın önüne fiziksel bir gri kart yerleştirmesi istenerek, özelliği izlenerek GrayWorldDeviceWhiteBalanceGains ve değerler yerleşene kadar beklenerek bir uygulamada uygulanabilir.

Uygulama daha sonra, değişiklikleri uygulamak için SetWhiteBalanceModeLockedWithDeviceWhiteBalanceGains özelliğindeki değerleri kullanarak yöntemin GrayWorldDeviceWhiteBalanceGains White Balance kazançlarını kilitler.

Beyaz Dengesi'nde değişiklik yapılabilmesi için Önce Yakalama Cihazının yapılandırmaya karşı kilitlenmesi gerekir.

El ile Beyaz Dengesi Örneği

Genel AV Yakalama Kurulumu kodu uygulandığında, UIViewController uygulamanın Görsel Taslak'a eklenebilir ve aşağıdaki gibi yapılandırılabilir:

UiViewController, uygulama Görsel Şeridi'ne eklenebilir ve el ile beyaz dengesi örneği için burada gösterildiği gibi yapılandırılabilir.

Görünüm aşağıdaki ana öğeleri içerir:

  • UIImageView Video akışının görüntüleneceği bir.
  • UISegmentedControl Odak Modu'nu Otomatik olan Kilitli olarak değiştirecek bir.
  • Sıcaklık ve Renk Tonunu gösterecek ve güncelleştirecek iki UISlider denetim.
  • Bir UIButton Gri Kart (Gri Dünya) alanını örneklemek ve bu değerleri kullanarak Beyaz Dengesi'ni ayarlamak için kullanılır.

El ile Beyaz Dengesi Denetimi için görünüm denetleyicisini bağlamak için aşağıdakileri yapın:

  1. Deyimleri kullanarak aşağıdakileri ekleyin:

    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. Aşağıdaki özel değişkenleri ekleyin:

    #region Private Variables
    private NSError Error;
    private bool Automatic = true;
    #endregion
    
  3. Aşağıdaki hesaplanan özellikleri ekleyin:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    public Timer SampleTimer { get; set; }
    #endregion
    
  4. Yeni beyaz dengesini Sıcaklık ve Renk Tonu olarak ayarlamak için aşağıdaki özel yöntemi ekleyin:

    #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 yöntemini geçersiz kılın ve aşağıdaki kodu ekleyin:

    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 Yöntemini geçersiz kılın ve görünüm yüklendiğinde kaydı başlatmak için aşağıdakileri ekleyin:

    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. kodundaki değişiklikleri kaydedin ve uygulamayı çalıştırın.

  8. Kamera Otomatik modda olduğundan, kamera beyaz dengesine göre ayarlı olarak kaydırıcılar otomatik olarak hareket eder:

    Kamera beyaz dengesini ayarladıkça kaydırıcılar otomatik olarak hareket eder

  9. Kilitli segmente dokunun ve beyaz dengesi el ile ayarlamak için Temp ve Tint kaydırıcılarını sürükleyin:

    Beyaz dengesini el ile ayarlamak için Temp ve Tint kaydırıcılarını sürükleyin

  10. Kilitli segment seçili durumdayken kameranın önüne fiziksel bir gri kart yerleştirin ve Gri Kart düğmesine dokunarak beyaz dengesi Gri Dünya'ya ayarlayın:

    Beyaz dengesi Gri Dünya'ya ayarlamak için Gri Kart düğmesine dokunun

  11. Uygulamayı durdurun.

Yukarıdaki kod, kamera Otomatik moddayken beyaz dengesi ayarlarının nasıl izleneceğini veya Kilitli moddayken beyaz dengesini denetlemek için kaydırıcıların nasıl kullanılacağını göstermiştir.

Köşeli Ayraçlı Yakalama

Köşeli Ayraçlı Yakalama, yukarıda sunulan El ile Kamera Denetimleri'ndeki ayarları temel alır ve uygulamanın çeşitli yollarla bir an yakalamasına olanak tanır.

Basitçe belirtmek gerekirse Köşeli Ayraçlı Yakalama, resimden resme çeşitli ayarlarla çekilen hareketsiz görüntülerden oluşan bir seridir.

Köşeli Ayraçlı Yakalama nasıl çalışır?

iOS 8'de Köşeli Ayraçlı Yakalama'yı kullanarak bir uygulama bir dizi El İle Kamera Denetimi önceden ayarlayabilir, tek bir komut verebilir ve geçerli sahnenin el ile gerçekleştirilen ön ayarlardan her biri için bir dizi görüntü döndürmesini sağlayabilir.

Köşeli Ayraçlı Yakalama Temel Bilgileri

Köşeli Ayraçlı Yakalama, resimden resme çeşitli ayarlarla çekilen hareketsiz görüntülerden oluşan bir seridir. Sağlanan Köşeli Ayraçlı Yakalama türleri şunlardır:

  • Otomatik Pozlama Köşeli Ayracı : Tüm görüntülerin çeşitli sapma miktarına sahip olduğu yer.
  • Manuel Pozlama Köşeli Ayracı – Tüm görüntülerin çeşitli Enstantane Hızı (Süre) ve ISO miktarına sahip olduğu yer.
  • Basit Seri Ayraç : Hızlı bir şekilde arka arkaya çekilen bir dizi hareketsiz görüntü.

iOS 8'de Yeni Köşeli Ayraçlı Yakalama Denetimleri

Tüm Köşeli Ayraçlı Yakalama komutları sınıfında uygulanır AVCaptureStillImageOutput . CaptureStillImageBracketBelirtilen ayarlar dizisine sahip bir dizi görüntü almak için yöntemini kullanın.

Ayarları işlemek için iki yeni sınıf uygulandı:

  • AVCaptureAutoExposureBracketedStillImageSettings – Otomatik pozlama köşeli ayracı için yanlılık ayarlamak için kullanılan bir özelliği ExposureTargetBiasvardır.
  • AVCaptureManual ExposureBracketedStillImageSettings – Manuel pozlama braketi için deklanşör hızını ve ISO'yi ayarlamak için kullanılan ve olmak üzere iki özelliği ExposureDuration ISOvardır.

Köşeli Ayraçlı Yakalama Denetimleri Yapma ve Yapma

Do's

iOS 8'de Köşeli Ayraçlı Yakalama denetimleri kullanılırken yapılması gerekenlerin listesi aşağıdadır:

  • yöntemini çağırarak PrepareToCaptureStillImageBracket uygulamayı en kötü durum yakalama durumuna hazırlayın.
  • Örnek arabelleklerin aynı paylaşılan havuzdan geleceğini varsayalım.
  • Önceki bir hazırlama çağrısı tarafından ayrılan belleği serbest bırakmak için yeniden çağırın PrepareToCaptureStillImageBracket ve bir nesne dizisi gönderin.

Yapılmayacaklar

iOS 8'de Köşeli Ayraçlı Yakalama denetimleri kullanılırken yapılması gerekenlerin listesi aşağıdadır:

  • Köşeli Ayraçlı Yakalama ayarları türlerini tek bir yakalamada karıştırmayın.
  • Tek bir yakalamada daha fazla MaxBracketedCaptureStillImageCount görüntü istemeyin.

Köşeli Ayraçlı Yakalama Ayrıntıları

iOS 8'de Köşeli Ayraçlı Yakalama ile çalışırken aşağıdaki ayrıntılar dikkate alınmalıdır:

  • Köşeli ayraçlı ayarlar, ayarları geçici olarak geçersiz kılar AVCaptureDevice .
  • Flash ve hareketsiz görüntü sabitleme ayarları yoksayılır.
  • Tüm görüntüler aynı çıkış biçimini (jpeg, png vb.) kullanmalıdır
  • Video önizlemesi çerçeveleri bırakabilir.
  • Köşeli Ayraçlı Yakalama, iOS 8 ile uyumlu tüm cihazlarda desteklenir.

Bu bilgileri göz önünde bulundurarak, iOS 8'de Köşeli Ayraçlı Yakalama'yı kullanma örneğine göz atalım.

Köşeli Ayraç Yakalama Örneği

Genel AV Yakalama Kurulumu kodu uygulandığında, UIViewController uygulamanın Görsel Taslak'a eklenebilir ve aşağıdaki gibi yapılandırılabilir:

UiViewController, uygulamalara Görsel Taslak eklenebilir ve burada gösterildiği gibi köşeli ayraç yakalama örneği yapılandırılabilir.

Görünüm aşağıdaki ana öğeleri içerir:

  • UIImageView Video akışının görüntüleneceği bir.
  • Yakalamanın sonuçlarını görüntüleyen üç UIImageViews .
  • Video UIScrollView akışını ve sonuç görünümlerini barındıracak A.
  • UIButton Önceden ayarlanmış bazı ayarlarla Köşeli Ayraçlı Yakalama almak için kullanılır.

Köşeli Ayraçlı Yakalama için görünüm denetleyicisini ayarlamak için aşağıdakileri yapın:

  1. Deyimleri kullanarak aşağıdakileri ekleyin:

    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. Aşağıdaki özel değişkenleri ekleyin:

    #region Private Variables
    private NSError Error;
    private List<UIImageView> Output = new List<UIImageView>();
    private nint OutputIndex = 0;
    #endregion
    
  3. Aşağıdaki hesaplanan özellikleri ekleyin:

    #region Computed Properties
    public AppDelegate ThisApp {
        get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
    }
    #endregion
    
  4. Gerekli çıkış görüntüsü görünümlerini oluşturmak için aşağıdaki özel yöntemi ekleyin:

    #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 yöntemini geçersiz kılın ve aşağıdaki kodu ekleyin:

    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 yöntemini geçersiz kılın ve aşağıdaki kodu ekleyin:

    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. kodundaki değişiklikleri kaydedin ve uygulamayı çalıştırın.

  8. Bir sahneyi çerçeveleyin ve Köşeli Ayraç Yakala düğmesine dokunun:

    Bir sahneyi çerçeveleyin ve Köşeli Ayraç Yakala düğmesine dokunun

  9. Köşeli Ayraçlı Yakalama tarafından çekilen üç görüntüyü görmek için sağa doğru çekin:

    Köşeli Ayraçlı Yakalama tarafından çekilen üç resmi görmek için sağa doğru çekin

  10. Uygulamayı durdurun.

Yukarıdaki kod, iOS 8'de Otomatik Pozlama Köşeli Ayraçlı Yakalama'nın nasıl yapılandırıldığını ve alındığını göstermiştir.

Özet

Bu makalede, iOS 8 tarafından sağlanan yeni El İle Kamera Denetimleri'ne giriş niteliğindeki bilgileri ele aldık ve ne yaptıklarına ve nasıl çalıştıklarına ilişkin temel bilgileri ele aldık. El ile Odaklanma, El ile Pozlama ve El ile Beyaz Dengesi örnekleri verdik. Son olarak, daha önce ele alınan El İle Kamera Denetimlerini kullanarak Köşeli Ayraçlı Yakalama'yı alan bir örnek verdik