IAsyncAction DetailPage::SaveButton_Click()

in PhotoEditor/DetailPage.cpp [594:622]


    IAsyncAction DetailPage::SaveButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        // Setup the picker.
        auto picker = FileSavePicker{};
        picker.SuggestedStartLocation(PickerLocationId::PicturesLibrary);
        picker.SuggestedFileName(L"New Image");
        picker.FileTypeChoices().Insert(L"Images", winrt::single_threaded_vector<hstring>({ L".jpg" }));

        if (auto file = co_await picker.PickSaveFileAsync())
        {
            if (auto stream = co_await file.OpenAsync(Windows::Storage::FileAccessMode::ReadWrite))
            {
                // Create the encoder from the stream.
                auto encoder = co_await BitmapEncoder::CreateAsync(BitmapEncoder::JpegEncoderId(), stream);

                RenderTargetBitmap renderTargetBitmap{};
                co_await renderTargetBitmap.RenderAsync(MainImage());

                IBuffer pixels = co_await renderTargetBitmap.GetPixelsAsync();
                auto newBuffer = SoftwareBitmap::CreateCopyFromBuffer
                (pixels, BitmapPixelFormat::Bgra8, Item().ImageProperties().Width(), Item().ImageProperties().Height());

                encoder.SetSoftwareBitmap(newBuffer);
                co_await encoder.FlushAsync();

                co_await Windows::Storage::CachedFileManager::CompleteUpdatesAsync(file);
            }
        }
    }