Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, yüksek dinamik aralıklı (HDR) fotoğraflar yakalamak için AdvancedPhotoCapture sınıfını nasıl kullanacağınız gösterilmektedir. Bu API ayrıca, son görüntünün işlenmesi tamamlanmadan önce HDR yakalamadan bir başvuru çerçevesi almanıza da olanak tanır.
HDR yakalama ile ilgili diğer makaleler şunlardır:
SceneAnalysisEffect kullanarak sistemin, HDR işlemenin yakalama sonucunu geliştirip geliştirmeyeceğini belirlemek için medya yakalama önizleme akışının içeriğini değerlendirmesine izin vekleyebilirsiniz. Daha fazla bilgi için bkz. MediaCaptureiçin sahne analizi
. Windows'un yerleşik HDR işleme algoritmasını kullanarak video yakalamak için HdrVideoControl kullanın. Daha fazla bilgi için bkz. video yakalama için cihaz denetimleri.
VariablePhotoSequenceCapture kullanarak her biri farklı yakalama ayarlarına sahip bir dizi fotoğraf yakalayabilir ve kendi HDR veya diğer işleme algoritmanızı uygulayabilirsiniz. Daha fazla bilgi için bkz. değişken fotoğraf dizisi
.
Not
Windows 10, sürüm 1709'dan başlayarak video kaydı ve AdvancedPhotoCapture eşzamanlı olarak kullanılması desteklenir. Bu, önceki sürümlerde desteklenmez. Bu değişiklik, Hazır bir LowLagMediaRecording ve AdvancedPhotoCapture aynı anda kullanabileceğiniz anlamına gelir.
MediaCapture.PrepareAdvancedPhotoCaptureAsync ve AdvancedPhotoCapture.FinishAsyncaramaları arasında video kaydını başlatabilir veya durdurabilirsiniz. Video kaydedilirken AdvancedPhotoCapture.CaptureAsync de çağırabilirsiniz. Bununla birlikte, video kaydederken HDR fotoğraf çekmek gibi bazı AdvancedPhotoCapture senaryoları
Not
Windows 10, sürüm 1709'dan itibaren, AdvancedPhotoCapture HDR moduna ayarlandığında, FlashControl.Enabled özelliği dikkate alınmaz ve flaş hiçbir zaman tetiklenmez. Diğer yakalama modları için, FlashControl.Enabledise, AdvancedPhotoCapture ayarlarını geçersiz kılar ve flash ile normal bir fotoğrafın yakalanmasına neden olur. Eğer Auto true olarak ayarlanırsa, AdvancedPhotoCapture geçerli sahnedeki koşullar için kamera sürücüsünün varsayılan davranışına bağlı olarak flaş kullanabilir veya kullanmayabilir. Önceki sürümlerde, AdvancedPhotoCapture flash ayarı her zaman FlashControl.Enabled ayarını geçersiz kılar.
Bağlam içinde veya kendi uygulamanız için başlangıç noktası olarak kullanılan API'yi görmek için kullanabileceğiniz AdvancedPhotoCapture sınıfının kullanımını gösteren tam bir örnek vardır. Daha fazla bilgi için bkz. Kamera Gelişmiş Yakalama örneği.
HDR fotoğraf yakalama
HDR fotoğraf yakalamanın geçerli cihazda desteklenip desteklenmediğini belirleme
Bu makalede açıklanan HDR yakalama tekniği, AdvancedPhotoCapture nesnesi kullanılarak gerçekleştirilir. Tüm cihazlar, AdvancedPhotoCaptureile HDR yakalamayı desteklemez. Uygulamanızın çalışmakta olduğu cihazın, mediacapture nesnesinin
m_hdrSupported = m_mediaCapture.VideoDeviceController.AdvancedPhotoControl.SupportedModes.Contains(Windows.Media.Devices.AdvancedPhotoMode.Hdr);
AdvancedPhotoCapture nesnesini yapılandırma ve hazırlama
AdvancedPhotoCapture örneğine kodunuzun içinde birden çok yerden erişmeniz gerekeceği için, nesneyi tutmak için bir üye değişkeni bildirmeniz gerekir.
private AdvancedPhotoCapture m_advancedCapture;
Uygulamanızda,
Yakalamanın kullanması gereken kodlama türünü belirten bir ImageEncodingProperties nesnesi geçirerek MediaCapture nesnesinin PrepareAdvancedPhotoCaptureAsyncçağırın. ImageEncodingProperties sınıfı, MediaCapturetarafından desteklenen görüntü kodlamaları oluşturmak için statik yöntemler sağlar.
PrepareAdvancedPhotoCaptureAsync, fotoğraf yakalamayı başlatmak için kullanacağınız AdvancedPhotoCapture nesnesini döndürür. Bu nesneyi, bu makalenin devamında açıklanan
if (m_hdrSupported == false) return;
// Choose HDR mode
var settings = new AdvancedPhotoCaptureSettings { Mode = AdvancedPhotoMode.Hdr };
// Configure the mode
m_mediaCapture.VideoDeviceController.AdvancedPhotoControl.Configure(settings);
// Prepare for an advanced capture
m_advancedCapture =
await m_mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Nv12));
// Register for events published by the AdvancedCapture
m_advancedCapture.AllPhotosCaptured += M_advancedCapture_AllPhotosCaptured;
m_advancedCapture.OptionalReferencePhotoCaptured += M_advancedCapture_OptionalReferencePhotoCaptured;
HDR fotoğraf yakalama
AdvancedPhotoCapture nesnesinin CaptureAsync yöntemini çağırarak HDR fotoğraf çekin. Bu yöntem, Frame özelliğinde yakalanan fotoğrafı sağlayan bir AdvancedCapturedPhoto nesnesi döndürür. Ardından fotoğraf diske kaydedilir.
try
{
// Start capture, and pass the context object
AdvancedCapturedPhoto advancedCapturedPhoto = await m_advancedCapture.CaptureAsync();
using (var frame = advancedCapturedPhoto.Frame)
{
var fileName = String.Format("SimplePhoto_{0}_HDR.jpg", DateTime.Now.ToString("HHmmss"));
StorageFile photoFile = await KnownFolders.PicturesLibrary.CreateFileAsync(fileName);
IRandomAccessStream stream = await photoFile.OpenAsync(FileAccessMode.ReadWrite);
await RandomAccessStream.CopyAndCloseAsync(advancedCapturedPhoto.Frame, stream);
}
}
catch (Exception ex)
{
Debug.WriteLine("Exception when taking an HDR photo: {0}", ex.ToString());
}
İsteğe bağlı başvuru çerçevesini alma
HDR işlemi birden çok kareyi yakalar ve ardından tüm kareler yakalandıktan sonra bunları tek bir görüntüde birleştirir. Bir kare yakalandıktan sonra ancak tüm HDR işlemi tamamlanmadan önce OptionalReferencePhotoCaptured olayını işleyerek erişim sağlayabilirsiniz. Yalnızca son HDR fotoğraf sonucuyla ilgileniyorsanız bunu yapmanız gerekmez.
Önemli
OptionalReferencePhotoCaptured, donanım HDR'yi destekleyen cihazlarda yükseltilmemiştir ve bu nedenle başvuru çerçeveleri oluşturmaz. Uygulamanız bu olayın tetiklenmediği durumu ele almalıdır.
Referans çerçevesi, CaptureAsyncçağrısının bağlam dışına çıktığından, bağlam bilgilerini OptionalReferencePhotoCaptured işleyicisine aktarmak için bir mekanizma sağlanır. İlk olarak bağlam bilgilerinizi içerecek bir nesneyi çağırmalısınız. Bu nesnenin adı ve içeriği size bağlı. Bu örnek, çekimin dosya adını ve kamera açısını izlemek için üyeleri bulunan bir nesne tanımlar.
public class MyAdvancedCaptureContextObject
{
public string CaptureFileName;
public PhotoOrientation CaptureOrientation;
}
Bağlam nesnenizin yeni bir örneğini oluşturun, üyelerini doldurun ve ardından nesneyi parametre olarak kabul eden CaptureAsync aşırı yüklemesine geçirin.
// Add the the capture time to the file name
var fileName = String.Format("SimplePhoto_{0}_HDR.jpg", DateTime.Now.ToString("HHmmss"));
// Create a context object, to identify the capture in the OptionalReferencePhotoCaptured event
var context = new MyAdvancedCaptureContextObject()
{
CaptureFileName = fileName,
};
// Start capture, and pass the context object
AdvancedCapturedPhoto advancedCapturedPhoto = await m_advancedCapture.CaptureAsync(context);
OptionalReferencePhotoCaptured olay işleyicisinde, OptionalReferencePhotoCapturedEventArgs nesnesinin Context özelliğini, kendi bağlam nesne sınıfınıza dönüştürün. Bu örnek, başvuru çerçevesi görüntüsünü son HDR görüntüsünden ayırt etmek için dosya adını değiştirir ve ardından görüntüyü diske kaydeder.
private async void M_advancedCapture_OptionalReferencePhotoCaptured(AdvancedPhotoCapture sender, OptionalReferencePhotoCapturedEventArgs args)
{
// Retrieve the context (i.e. what capture does this belong to?)
var context = args.Context as MyAdvancedCaptureContextObject;
// Remove "_HDR" from the name of the capture to create the name of the reference
var referenceName = context.CaptureFileName.Replace("_HDR", "");
using (var frame = args.Frame)
{
await SaveCapturedFrameAsync(frame, referenceName, context.CaptureOrientation);
}
}
Tüm çerçeveler yakalandığında bir bildirim al
HDR fotoğraf yakalamanın iki adımı vardır. İlk olarak, birden çok kare yakalanır ve ardından kareler son HDR görüntüsüne işlenir. Kaynak HDR çerçeveleri yakalanmaya devam ederken başka bir yakalama başlatamazsınız, ancak tüm kareler yakalandıktan sonra ancak HDR sonrası işlem tamamlanmadan önce yakalama başlatabilirsiniz. AllPhotosCaptured olayı, HDR yakalamaları tamamlandığında tetiklenir ve başka bir yakalama başlatabileceğinizi size bildirir. Tipik bir senaryo, HDR yakalama başladığında kullanıcı arabiriminizin yakalama düğmesini devre dışı bırakmak ve ardından AllPhotosCaptured yükseltildiğinde yeniden etkinleştirmektir.
private void M_advancedCapture_AllPhotosCaptured(AdvancedPhotoCapture sender, object args)
{
// Update UI to enable capture button
}
AdvancedPhotoCapture nesnesini temizleme
Uygulamanız yakalamayı bitirdiğinde, MediaCapture nesnesini yok etmeden önce, FinishAsync çağırarak ve üye değişkeninizi null olarak ayarlayarak AdvancedPhotoCapture nesnesini kapatmanız gerekir.
await m_advancedCapture.FinishAsync();
m_advancedCapture = null;
Düşük ışıklı fotoğraf yakalama
Windows 10, sürüm 1607 AdvancedPhotoCapture'den başlayarak, düşük ışıklı ayarlarda yakalanan fotoğrafların kalitesini artıran yerleşik bir algoritma kullanılarak fotoğrafları yakalamak için kullanılabilir. AdvancedPhotoCapture sınıfının düşük ışık özelliğini kullandığınızda sistem geçerli sahneyi değerlendirir ve gerekirse düşük ışık koşullarını telafi etmek için bir algoritma uygular. Sistem algoritmanın gerekli olmadığını belirlerse, bunun yerine düzenli bir yakalama gerçekleştirilir.
Düşük ışıklı fotoğraf yakalamayı kullanmadan önce, mediacapture nesnesinin
m_lowLightSupported = m_mediaCapture.VideoDeviceController.AdvancedPhotoControl.SupportedModes.Contains(Windows.Media.Devices.AdvancedPhotoMode.LowLight);
Uygulamanızda,
Yakalamanın kullanması gereken kodlama türünü belirten bir ImageEncodingProperties nesnesi geçirerek MediaCapture nesnesinin PrepareAdvancedPhotoCaptureAsyncçağırın.
if (m_lowLightSupported == false) return;
// Choose LowLight mode
var settings = new AdvancedPhotoCaptureSettings { Mode = AdvancedPhotoMode.LowLight };
m_mediaCapture.VideoDeviceController.AdvancedPhotoControl.Configure(settings);
// Prepare for an advanced capture
m_advancedCapture =
await m_mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateJpeg());
Fotoğraf yakalamak için, CaptureAsyncöğesini arayın.
AdvancedCapturedPhoto advancedCapturedPhoto = await m_advancedCapture.CaptureAsync();
StorageFile photoFile = await KnownFolders.PicturesLibrary.CreateFileAsync($"Photo_{advancedCapturedPhoto.Mode}.jpg", CreationCollisionOption.GenerateUniqueName);
IRandomAccessStream stream = await photoFile.OpenAsync(FileAccessMode.ReadWrite);
await RandomAccessStream.CopyAndCloseAsync(advancedCapturedPhoto.Frame, stream);
AdvancedPhotoCapture nesnesini yeniden yapılandırmadan birden fazla düşük ışıklı fotoğraf yakalayabilirsiniz, ancak yakalamayı bitirdiğinizde nesneyi ve ilişkili kaynakları temizlemek için FinishAsync çağırmanız gerekir.
await m_advancedCapture.FinishAsync();
m_advancedCapture = null;
AdvancedCapturedPhoto nesneleriyle çalışma
AdvancedPhotoCapture.CaptureAsync, yakalanan fotoğrafı temsil eden bir AdvancedCapturedPhoto nesnesi döndürür. Bu nesne, görüntüyü temsil eden bir CapturedFrame nesnesi sağlayan Frame özelliğini sunar. OptionalReferencePhotoCaptured olayı, olay argümanlarında bir CapturedFrame nesnesi de sağlar. Bu tür bir nesne aldıktan sonra, SoftwareBitmap oluşturma veya görüntüyü bir dosyaya kaydetme gibi onunla yapabileceğiniz birçok şey vardır.
CapturedFrame'den bir SoftwareBitmap alma
Bir CapturedFrame nesnesinden SoftwareBitmap almak için nesnenin SoftwareBitmap özelliğine basitçe erişin. Ancak çoğu kodlama biçimi, AdvancedPhotoCaptureile SoftwareBitmap desteklemez, bu nedenle özelliği kullanmadan önce özelliğin null olmadığından emin olmanız gerekir.
SoftwareBitmap bitmap;
if (advancedCapturedPhoto.Frame.SoftwareBitmap != null)
{
bitmap = advancedCapturedPhoto.Frame.SoftwareBitmap;
}
Geçerli sürümde, AdvancedPhotoCapture için SoftwareBitmap destekleyen tek kodlama biçimi sıkıştırılmamış NV12'dir. Bu nedenle, bu özelliği kullanmak istiyorsanız, PrepareAdvancedPhotoCaptureAsyncçağırdığınızda bu kodlamayı belirtmeniz gerekir.
m_advancedCapture =
await m_mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Nv12));
Elbette, görüntüyü her zaman bir dosyaya kaydedebilir ve ardından dosyayı ayrı bir adımda SoftwareBitmap yükleyebilirsiniz.
Windows developer