¿Copiar imagen con canal alfa al portapapeles con color de fondo personalizado?

Código:

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);
}

Lo que necesito :

Renderice un lienzo con fondo transparente a la imagen, luego cópielo al portapapeles (¿No es simple? ¿No es así?)

Problema

Al pegar, me sale una imagen fea con fondo negro

Solución 1:

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

No. Este grueso no funciona, el fondo decanvas no cambiará en el próximorenderBitmap.Render(canvas);

En su lugar, tengo que usar un temporizador, darle a WPF algo de tiempo para cambiar el fondo, luego renderizarlo en el evento de ese temporizador. Funciona, pero desafortunadamente, el contenido decanvas es más grande que su tamaño ... por lo que el fondo blanco solo puede cubrir parte de él, y aún así es un resultado feo. (Por cierto, ¿alguien sabe por qué se necesita algún tiempo para cambiar el fondo? Pensé que debería cambiarse al instante)

¿Hice algo mal? ¿Cómo puedo obtener una imagen ex-transparente de fondo blanco en el portapapeles?

Además, me he dado cuenta de que el fondo de algunas imágenes PNG permanece en blanco si lo pegas en mspaint.exe, que no admite el canal alfa, pero otras se vuelven negras.

¿Hay algo como decir,alternative color, que se usa como fondo si el lugar donde pega la imagen no es compatible con el canal alfa? ¿Podemos personalizarlo?

Ahora le di otraBitmapSource Con contenido blanco, si hay una forma de combinarlo con elrenderBitmap De fondo, el problema se resolvió, pero no sé cómo ...

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta