PhotoConfirmationCapturedEventArgs.Frame Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene il frame acquisito.
public:
property CapturedFrame ^ Frame { CapturedFrame ^ get(); };
CapturedFrame Frame();
public CapturedFrame Frame { get; }
var capturedFrame = photoConfirmationCapturedEventArgs.frame;
Public ReadOnly Property Frame As CapturedFrame
Valore della proprietà
Frame acquisito.
Commenti
I dati restituiti nella proprietà Frame sono dati pixel non elaborati. In altre parole, non include un'intestazione di formato di file immagine. A causa di questo, non è possibile passare direttamente il flusso del frame acquisito al metodo SetSourceAsync della bitmap. È invece necessario copiare manualmente i dati pixel nel buffer pixel della bitmap. I frammenti di codice seguenti illustrano come copiare i dati dell'immagine e fornire una classe helper che esegue l'operazione.
Prima di tutto, è necessario abilitare la conferma delle foto e collegare l'evento PhotoConfirmationCaptured .
private void EnablePhotoConfirmation()
{
_mediaCapture.VideoDeviceController.PhotoConfirmationControl.Enabled = true;
_mediaCapture.PhotoConfirmationCaptured += PhotoConfirmationCaptured;
}
void PhotoConfirmationCaptured(MediaCapture sender, PhotoConfirmationCapturedEventArgs args)
{
using (ManualResetEventSlim evt = new ManualResetEventSlim(false))
{
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
try
{
WriteableBitmap bmp = new WriteableBitmap(unchecked((int)args.Frame.Width), unchecked((int)args.Frame.Height));
using (var istream = args.Frame.AsStream())
using (var ostream = bmp.PixelBuffer.AsStream())
{
await istream.CopyStreamToAsync(ostream);
}
}
finally
{
evt.Set();
}
});
evt.Wait();
}
}
Il frammento di codice seguente mostra la classe helper che definisce i metodi di estensione per la copia dei dati del frame acquisito nel flusso di dati pixel della bitmap scrivibile. La classe fornisce metodi e overload sincroni e asincroni che consentono di specificare una dimensione del buffer di copia o di usare una dimensione predefinita.
public static class StreamEx
{
public static void CopyStreamTo(this Stream inputStream, Stream outputStream)
{
inputStream.CopyStreamTo(outputStream, 4096);
}
public static void CopyStreamTo(this Stream inputStream, Stream outputStream, int bufferSize)
{
if (inputStream == null)
{
throw new ArgumentNullException("inputStream");
}
if (!inputStream.CanSeek)
{
throw new ArgumentException("Cannot seek in the input stream.", "inputStream");
}
if (!inputStream.CanRead)
{
throw new ArgumentException("Input stream is not readable.", "inputStream");
}
if (outputStream == null)
{
throw new ArgumentNullException("outputStream");
}
if (!outputStream.CanSeek)
{
throw new ArgumentException("Cannot seek in the output stream.", "outputStream");
}
if (!outputStream.CanWrite)
{
throw new ArgumentException("Output stream is not writeable.", "outputStream");
}
if (bufferSize <= 0)
{
throw new ArgumentOutOfRangeException("bufferSize", "Buffer size is equal to zero or negative.");
}
inputStream.Seek(0, SeekOrigin.Begin);
outputStream.Seek(0, SeekOrigin.Begin);
byte[] buffer = new byte[bufferSize];
while (inputStream.Position < inputStream.Length)
{
int bytesRead = inputStream.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, bytesRead);
}
}
public static Task CopyStreamToAsync(this Stream inputStream, Stream outputStream)
{
return Task.Run(() => CopyStreamTo(inputStream, outputStream));
}
public static Task CopyStreamToAsync(this Stream inputStream, Stream outputStream, int bufferSize)
{
return Task.Run(() => CopyStreamTo(inputStream, outputStream, bufferSize));
}
}