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:
Giriş, yoluyla bir AVCaptureDeviceInput
öğesinden içine AVCaptureSession
AVCaptureConnection
alınır. Sonuç, hareketsiz görüntü olarak veya video akışı olarak çıkıştır. İşlemin tamamı bir AVCaptureDevice
tarafı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 UIImageView
iç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:
Düzenlemek üzere açmak için Çözüm Gezgini dosyaya çift tıklayın
AppDelegate.cs
.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;
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
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; }
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:
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 FocusMode
mevcut 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:
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:
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;
Aşağıdaki özel değişkenleri ekleyin:
#region Private Variables private NSError Error; private bool Automatic = true; #endregion
Aşağıdaki hesaplanan özellikleri ekleyin:
#region Computed Properties public AppDelegate ThisApp { get { return (AppDelegate)UIApplication.SharedApplication.Delegate; } } public Timer SampleTimer { get; set; } #endregion
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(); }; }
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 (); } }
Kamera Otomatik modda olduğundan, kamera odağı ayarladıkça kaydırıcı otomatik olarak hareket eder:
Kilitli segmente dokunun ve mercek konumunu el ile ayarlamak için konum kaydırıcısını sürükleyin:
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:
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:
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.
İ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.
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:
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:
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;
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
Aşağıdaki hesaplanan özellikleri ekleyin:
#region Computed Properties public AppDelegate ThisApp { get { return (AppDelegate)UIApplication.SharedApplication.Delegate; } } public Timer SampleTimer { get; set; } #endregion
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(); }; }
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 (); } }
Kamera Otomatik modda olduğundan, kamera pozlamayı ayarladıkça kaydırıcılar otomatik olarak hareket eder:
Otomatik pozlamanın sapmasını el ile ayarlamak için Kilitli segmente dokunun ve Sapma kaydırıcısını sürükleyin:
Özel segmente dokunun ve pozlamayı el ile denetlemek için Süre ve ISO kaydırıcılarını sürükleyin:
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.
Ö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.
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.GetTemperatureAndTintValues
Sı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:
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:
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;
Aşağıdaki özel değişkenleri ekleyin:
#region Private Variables private NSError Error; private bool Automatic = true; #endregion
Aşağıdaki hesaplanan özellikleri ekleyin:
#region Computed Properties public AppDelegate ThisApp { get { return (AppDelegate)UIApplication.SharedApplication.Delegate; } } public Timer SampleTimer { get; set; } #endregion
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
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 (); } }; }
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 (); } }
kodundaki değişiklikleri kaydedin ve uygulamayı çalıştırın.
Kamera Otomatik modda olduğundan, kamera beyaz dengesine göre ayarlı olarak kaydırıcılar otomatik olarak hareket eder:
Kilitli segmente dokunun ve beyaz dengesi el ile ayarlamak için Temp ve Tint kaydırıcılarını sürükleyin:
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:
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.
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
. CaptureStillImageBracket
Belirtilen 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ğiExposureTargetBias
vardı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ğiExposureDuration
ISO
vardı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:
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:
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;
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
Aşağıdaki hesaplanan özellikleri ekleyin:
#region Computed Properties public AppDelegate ThisApp { get { return (AppDelegate)UIApplication.SharedApplication.Delegate; } } #endregion
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
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(); }); }; }
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 (); } }
kodundaki değişiklikleri kaydedin ve uygulamayı çalıştırın.
Bir sahneyi çerçeveleyin ve Köşeli Ayraç Yakala düğmesine dokunun:
Köşeli Ayraçlı Yakalama tarafından çekilen üç görüntüyü görmek için sağa doğru çekin:
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