Skopiuj obraz z kanału alfa do schowka z niestandardowym kolorem tła?

Kod :

private void Foo(Canvas canvas)
{
    // The content is a bit larger...
    Size size = new Size(canvas.ActualWidth * 1.1, canvas.ActualHeight * 1.2);

    // Create a render bitmap and push the surface to it
    RenderTargetBitmap renderBitmap =
        new RenderTargetBitmap(
        (int)size.Width,
        (int)size.Height,
        96d,
        96d,
        PixelFormats.Pbgra32
    );
    renderBitmap.Render(canvas);

    // Then copy to clipboard
    Clipboard.SetImage(renderBitmap);
}

Czego potrzebuję :

Renderuj płótno z przezroczystym tłem do obrazu, a następnie skopiuj je do schowka (Zamknij proste? Nie do końca)

Problem:

Po wklejeniu otrzymuję brzydki obraz z czarnym tłem

Rozwiązanie 1:

canvas.Background = new SolidColorBrush(Colors.White);

Nie. Ten gruby nie działa, tłocanvas nie zmieni się w następnymrenderBitmap.Render(canvas);

Zamiast tego muszę użyć timera, dać WPF trochę czasu na zmianę tła, a następnie wyrenderować go w zdarzeniu kleszczy tego timera. Działa, ale niestety zawartośćcanvas jest większy niż jego rozmiar ... więc białe tło może pokryć tylko jego część, wciąż brzydki wynik. (BTW ktoś wie, dlaczego czasami trzeba zmienić tło? Myślałem, że należy je natychmiast zmienić)

Czy zrobiłem coś złego? Jak mogę uzyskać białe przezroczyste zdjęcie w schowku?

Co więcej, zauważyłem, że tło niektórych obrazów PNG pozostaje białe, jeśli wkleisz je do mspaint.exe, które nie obsługują kanału alfa, ale niektóre inne stają się czarne.

Czy jest coś takiego, powiedzmy,alternative color, który jest używany jako tło, jeśli miejsce wklejania obrazu nie obsługuje kanału alfa? Czy możemy to dostosować?

Teraz wyrenderowałem innyBitmapSource z białą zawartością, jeśli istnieje sposób na połączenie jej zrenderBitmap jako tło problem rozwiązany, ale nie wiem jak ...

int dWidth = (int)size.Width;
int dHeight = (int)size.Height;
int dStride = dWidth * 4;
byte[] pixels = new byte[dHeight * dStride];
for (int i = 0; i < pixels.Length; i++)
{
    pixels[i] = 0xFF;
}
BitmapSource bg = BitmapSource.Create(
    dWidth,
    dHeight,
    96,
    96,
    PixelFormats.Pbgra32,
    null,
    pixels,
    dStride
);
// Combine bg with renderBitmap

questionAnswers(2)

yourAnswerToTheQuestion