Скопировать изображение с альфа-каналом в буфер обмена с пользовательским цветом фона?
Код:
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