/// <summary> /// Captures an image asynchronously. /// </summary> /// <param name="settings">The settings.</param> /// <param name="ct">The ct.</param> /// <returns>The image bytes</returns> /// <exception cref="InvalidOperationException">Cannot use camera module because it is currently busy.</exception> public async Task <byte[]> CaptureImageAsync(CameraStillSettings settings, CancellationToken ct = default) { if (Instance.IsBusy) { throw new InvalidOperationException("Cannot use camera module because it is currently busy."); } if (settings.CaptureTimeoutMilliseconds <= 0) { throw new ArgumentException($"{nameof(settings.CaptureTimeoutMilliseconds)} needs to be greater than 0"); } try { OperationDone.Reset(); var output = new MemoryStream(); var exitCode = await ProcessRunner.RunProcessAsync( settings.CommandName, settings.CreateProcessArguments(), (data, proc) => { output.Write(data, 0, data.Length); }, null, true, ct); return(exitCode != 0 ? new byte[] { } : output.ToArray()); } finally { OperationDone.Set(); } }
/// <summary> /// Captures a JPEG encoded image asynchronously at 90% quality. /// </summary> /// <param name="width">The width.</param> /// <param name="height">The height.</param> /// <param name="ct">The ct.</param> /// <returns>The image bytes</returns> public Task <byte[]> CaptureImageJpegAsync(int width, int height, CancellationToken ct = default) { var settings = new CameraStillSettings { CaptureWidth = width, CaptureHeight = height, CaptureJpegQuality = 90, CaptureTimeoutMilliseconds = 300, }; return(CaptureImageAsync(settings, ct)); }
/// <summary> /// Captures an image. /// </summary> /// <param name="settings">The settings.</param> /// <returns>The image bytes</returns> public byte[] CaptureImage(CameraStillSettings settings) { return(CaptureImageAsync(settings).GetAwaiter().GetResult()); }
/// <summary> /// Captures an image asynchronously. /// </summary> /// <param name="settings">The settings.</param> /// <returns></returns> public async Task <byte[]> CaptureImageAsync(CameraStillSettings settings) { var cts = new CancellationTokenSource(); return(await CaptureImageAsync(settings, cts.Token)); }