Скопировать изображение с альфа-каналом в буфер обмена с пользовательским цветом фона?

Код:

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

Что мне нужно

Нарисуйте холст с прозрачным фоном для изображения, затем скопируйте его в буфер обмена (Выйти просто? Не совсем)

Проблема:

При вставке получаю уродливое изображение с черным фоном

Решение 1:

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

No. Это толстые не работают, фонcanvas не изменится в следующемrenderBitmap.Render(canvas);

Вместо этого мне нужно использовать таймер, дать WPF некоторое время для изменения фона, а затем отобразить его в событии тика этого таймера. Работает, но, к сожалению, содержаниеcanvas больше, чем его размер ... так что белый фон может покрывать только его часть, но все равно ужасный результат. (Кстати, кто-нибудь знает, почему требуется некоторое время, чтобы сменить фон? Я думал, что он должен быть изменен немедленно

Я сделал что-то неправильно? Как я могу получить белый фон с прозрачным изображением в буфере обмена?

Более того, я заметил, что фон некоторых изображений PNG остается белым, если вставить его в mspaint.exe, который не поддерживает альфа-канал, но некоторые другие становятся черными.

Есть что-то вроде, скажем,alternative color, который используется в качестве фона, если место, куда вы вставляете свое изображение, не поддерживает альфа-канал? Можем ли мы сделать это на заказ?

Теперь я сделал еще одинBitmapSource с белым содержимым, если есть способ объединить его с RenderBitmap как фон, проблема решена, но я не знаю как ...

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

Ответы на вопрос(2)

Ваш ответ на вопрос