Exemplo n.º 1
0
        private async Task WriteToDiskAsync()
        {
            var diskWriteInputPackages = CollectedColorFrames.Concat(CollectedIlluminatedInfraredFrames).Concat(CollectedNonIlluminatedInfraredFrames)
                                         .AsParallel().Select(async frame =>
            {
                SoftwareBitmap compatibleBitmap = null;
                Action cleanupAction            = () => { };
                if (frame.SoftwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
                    frame.SoftwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Ignore)
                {
                    compatibleBitmap = SoftwareBitmap.Convert(frame.SoftwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore);
                    cleanupAction    = () => compatibleBitmap.Dispose();
                }
                else
                {
                    compatibleBitmap = frame.SoftwareBitmap;
                }

                var fileName        = ((ulong)frame.SystemRelativeTime?.Ticks).ToString("D10");
                var encodingOptions = new BitmapPropertySet();
                var encoderId       = Guid.Empty;

                if (frame.SourceKind == MediaFrameSourceKind.Color)
                {
                    fileName  = "RGB-" + fileName + ".jpg";
                    encoderId = BitmapEncoder.JpegEncoderId;
                    encodingOptions.Add("ImageQuality", new BitmapTypedValue(
                                            1.0, // Maximum quality
                                            Windows.Foundation.PropertyType.Single));
                }
                else if (frame.SourceKind == MediaFrameSourceKind.Infrared)
                {
                    if (frame.IsIlluminated == true)
                    {
                        fileName = "IIR-" + fileName;  // Illuminated IR
                    }
                    else
                    {
                        fileName = "AIR-" + fileName;  // Ambient IR
                    }

                    fileName += ".png";
                    encoderId = BitmapEncoder.PngEncoderId;
                }

                var memoryStream      = new InMemoryRandomAccessStream();
                BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, memoryStream, encodingOptions);
                encoder.SetSoftwareBitmap(compatibleBitmap);
                await encoder.FlushAsync();
                return(new { Stream = memoryStream.AsStream(), CleanupAction = cleanupAction, FileName = fileName });
            })
                                         .Select(task => task.ToObservable()).Merge().ObserveOn(NewThreadScheduler.Default).ToEnumerable(); // sequentialize awaitables

            var zipPath = Path.Combine(WorkingFolder.Path, "CollectedData.zip");

            using (FileStream zipFileStream = new FileStream(zipPath, FileMode.Create))
            {
                using (ZipArchive archive = new ZipArchive(zipFileStream, ZipArchiveMode.Create))
                {
                    foreach (var input in diskWriteInputPackages)
                    {
                        ZipArchiveEntry zipImgFileEntry = archive.CreateEntry(input.FileName, CompressionLevel.NoCompression);
                        using (Stream zipEntryStream = zipImgFileEntry.Open())
                        {
                            await input.Stream.CopyToAsync(zipEntryStream);
                        }

                        ++WrittenToDiskFramesCount;
                    }

                    ZipArchiveEntry zipMetadataFileEntry = archive.CreateEntry("info.json", CompressionLevel.NoCompression);
                    using (Stream zipEntryStream = zipMetadataFileEntry.Open())
                    {
                        MetadataWriter.WriteSerialization(zipEntryStream.AsOutputStream(), MediaCapture.Properties);
                    }
                }
            }

            foreach (var input in diskWriteInputPackages)
            {
                input.CleanupAction();
                input.Stream.Dispose();
            }
        }