Изображение WPF C# Capture Canvas с полупрозрачным фоном

ОБНОВЛЕНИЕ: не является дубликатом.

Мой вопрос не в том, как сделать скриншот. Я знаю это, но это не то, что мне нужно. У меня могут быть другие элементы управления холстом, и я не хочу их захватывать, а только изображение на холсте с изображением, которое видно в прозрачности под холстом.

Мне нужно захватить изображение на холсте с непрозрачностью 50%, но захваченное изображение имеет черный фон вместо изображения в фоновом режиме (рабочий стол).

Я использую этот код для захвата изображения:

MemoryStream ms = new MemoryStream();
RenderTargetBitmap rtb = new RenderTargetBitmap(1920, 1080, 96d, 96d, PixelFormats.Default);
rtb.Render(canvasCapture);
BmpBitmapEncoder BmpEncoder = new BmpBitmapEncoder();
BmpEncoder.Frames.Add(BitmapFrame.Create(rtb));
BmpEncoder.Save(ms);

Это холст:

<Canvas x:Name="canvasCapture" Background="#7F0F0F0E" />

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


person user2272143    schedule 03.10.2019    source источник
comment
BMP не поддерживает прозрачность. Попробуйте PNG.   -  person Clemens    schedule 03.10.2019
comment
Из вашего комментария ниже: Мне нужно захватить растровое изображение, потому что мне нужно закодировать его в видео с помощью AForge -- AForge поддерживает PNG. Что касается захвата изображения с фоном, а не с прозрачными пикселями, это зависит от того, как и что вы снимаете. Если визуализировать визуализацию непосредственно в программе WPF, будут отображаться только те вещи, о которых программа WPF знает. Это не считая фона рабочего стола. Если вы хотите включить фон рабочего стола, вам нужно использовать что-то, что будет захватывать фактические пиксели экрана. См. отмеченные дубликаты.   -  person Peter Duniho    schedule 03.10.2019
comment
@PeterDuniho Мой вопрос не в том, как сделать снимок экрана. Я знаю это, но это не то, что мне нужно. У меня могут быть другие элементы управления холстом, и я не хочу их захватывать, а только изображение на холсте с изображением, которое видно в прозрачности под холстом.   -  person user2272143    schedule 03.10.2019
comment
@PeterDuniho PS. Я привязал видео к кодированию PNG, но когда я его проигрываю, я получаю сообщение об ошибке Неподдерживаемый формат. Кстати, это не имеет значения, сохраняю ли я BMP или PNG, поскольку, как я уже сказал, мне нужно захватить изображение под Canvas, а не пустой прозрачный фон.   -  person user2272143    schedule 03.10.2019
comment
Мой вопрос не в том, как сделать снимок экрана — конечно. Вы специально заявили, что хотите, чтобы растровое изображение включало изображение фона рабочего стола за вашим прозрачным окном. Единственный способ сделать это — сделать снимок экрана. Затем вам, возможно, придется обрезать результат, если на экране есть другие элементы, которые вы не хотите включать. Но начать нужно со скриншота.   -  person Peter Duniho    schedule 04.10.2019
comment
@PeterDuniho Обрезайте захваченное изображение снимка экрана, не удаляйте элементы управления, размещенные на холсте (я сказал НАД, а не внутри). Если я отображаю только содержимое Canvas, все элементы управления (не внутри) не отображаются, но если я делаю снимок экрана, эти элементы управления отображаются. У меня есть панели инструментов и диалоговые окна, которые отображаются, когда пользователь использует приложение, и они не должны быть видны в видео.   -  person user2272143    schedule 04.10.2019
comment
Примечание для тех, кто может повторно открыть это: это абсолютно дубликат. Пожалуйста, ознакомьтесь с требованиями ОП, прежде чем щелкнуть ссылку повторного открытия. У меня есть панели инструментов и диалоговые окна, которые отображаются, когда пользователь использует приложение, и они не должны быть видны в видео -- тогда вам придется временно сделать их невидимыми (т.е. установить значение Visibility.Hidden), когда вы делаете снимок экрана. Или вы можете отказаться от требования, чтобы фон рабочего стола был включен в изображение. В любом случае, вопрос, который вы задали, является дубликатом того, который отмечен выше.   -  person Peter Duniho    schedule 04.10.2019
comment
@PeterDuniho Если кто-то не может понять вопрос, не следует навязывать ответ. Опять же, мне нужно захватить только то, что находится внутри Canvas, а НЕ на экране. Я не могу скрыть панель инструментов, когда пользователю нужно ее использовать, и видео должно быть записано одновременно. Чтобы быть более точным, мне нужно решение для захвата видимых пикселей только внутри Canvas, а не для захвата области экрана.   -  person user2272143    schedule 04.10.2019
comment
Опять же, ваше заявленное требование состоит в том, чтобы вы сделали снимок экрана. Из вашего вопроса: захваченное изображение имеет черный фон вместо изображения в фоновом режиме (рабочий стол). Не существует практического способа получить изображение в фоновом режиме, кроме как сделать снимок экрана. Ваш отказ принять эту истину только вредит вам.   -  person Peter Duniho    schedule 04.10.2019
comment
@PeterDuniho Кстати, мы работаем над подходом GDI для захвата только снимка экрана содержимого холста - снова СОДЕРЖАНИЕ, а не область экрана. Когда мы закончим, я опубликую решение, чтобы вы могли видеть, что если вы чего-то не знаете, это не значит, что это невозможно.   -  person user2272143    schedule 04.10.2019
comment
Мы работаем над подходом GDI, позволяющим захватывать только снимок экрана содержимого холста — снимок экрана, даже если он является частью экрана, все равно остается снимком экрана. Поэтому я нахожу замечательным, что вы, с одной стороны, заявили, что ваш текущий подход к решению вашей проблемы заключается в том, чтобы сделать снимок экрана, а с другой стороны, заявили, что ваш вопрос не о том, чтобы сделать снимок экрана.   -  person Peter Duniho    schedule 04.10.2019
comment
@PeterDuniho Вам понятна разница между областью экрана и содержимым элемента управления? Ну, это, вероятно, неправильный способ назвать это скриншотом, я должен сказать, что он захватывает видимые пиксели содержимого Canvas, что не то же самое, что визуализировать содержимое Canvas.   -  person user2272143    schedule 04.10.2019


Ответы (1)


Растровые изображения не поддерживают прозрачный фон. Он автоматически заполняет прозрачные области черным цветом. Вы можете попытаться сохранить и использовать ваши изображения в формате PNG.

person Emre Ates    schedule 03.10.2019
comment
Спасибо за Ваш ответ. Мне не нужно иметь изображение с прозрачностью, а нужно захватить изображение с фоном, который я вижу в прозрачности. Также мне нужно захватить растровое изображение, потому что мне нужно закодировать его в видео с помощью AForge. - person user2272143; 03.10.2019