public static MemoryStream ToMemoryStream([NotNull] this BitmapSource bitmapSource,
                                                  [NotNull][InstantHandle] BitmapEncoderFactory bitmapEncoderFactory)
        {
            if (bitmapSource == null)
            {
                throw new ArgumentNullException(nameof(bitmapSource));
            }
            if (bitmapEncoderFactory == null)
            {
                throw new ArgumentNullException(nameof(bitmapEncoderFactory));
            }

            var bitmapEncoder = bitmapEncoderFactory.Invoke();

            {
                var bitmapFrame = BitmapFrame.Create(bitmapSource);
                bitmapEncoder.Frames.Add(bitmapFrame);
            }

            var result = new MemoryStream();

            bitmapEncoder.Save(result);

            result.Seek(0L,
                        SeekOrigin.Begin);

            return(result);
        }
        public static async Task <BitmapSize> ConvertAsync(
            List <ImageViewModel> images,
            StorageFolder targetFolder,
            BitmapConversionSettings settings,
            Action <int> progressCallback)
        {
            foreach (var image in images)
            {
                image.Status = image.ExtendedStatus = null;
            }

            uint success = 0;
            uint fail    = 0;

            int i = 1;

            foreach (var image in images)
            {
                progressCallback(i);
                i++;
                image.Status = "Converting...";

                try
                {
                    BitmapConversionResult result =
                        await BitmapEncoderFactory.EncodeAsync(image.File, targetFolder, settings).AsTask().ConfigureAwait(false);

                    if (result.Success)
                    {
                        image.Status      = $"Converted ({result.ResultFileSize / 1024d / 1024d:0.00} MB)";
                        image.LastSuccess = true;
                        success++;
                    }
                    else
                    {
                        image.Status         = "Failed";
                        image.ExtendedStatus = result.Status;
                        image.LastSuccess    = false;
                        fail++;
                    }
                }
                catch
                {
                    image.Status         = "Failed";
                    image.ExtendedStatus = "Unspecified error";
                    fail++;
                }
            }

            return(new BitmapSize {
                Width = success, Height = fail
            });
        }