Удалить альфа-символ из BitmapSource
-
20-09-2019 - |
Вопрос
Я использую BitBlt() и CreateBitmapSourceFromHBitmap() для захвата окна в качестве растрового источника, который я могу отобразить на элементе изображения в приложении WPF.Но по какой-то причине большая часть приложения, которое он захватывает, прозрачна.Вот источник противзапечатлейте изображение того, что происходит:
(источник: umbc.edu)
Он серый, потому что фон окна, в котором он находится, серый.Какой бы фон я ни задал, окно будет просвечиваться.
Как я могу сделать так, чтобы захваченное изображение более точно отражало оригинал?
Решение
Проблема в вашем коде может быть связана с используемым вами Win32 API (CreateCompatibleDC
, SelectObject
, CreateBitmap
...).Я попробовал использовать более простой код, используя только GetDC
и BitBlt
, и у меня это прекрасно работает.Вот мой код:
public static Bitmap Capture(IntPtr hwnd)
{
IntPtr hDC = GetDC(hwnd);
if (hDC != IntPtr.Zero)
{
Rectangle rect = GetWindowRectangle(hwnd);
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
using (Graphics destGraphics = Graphics.FromImage(bmp))
{
BitBlt(
destGraphics.GetHdc(),
0,
0,
rect.Width,
rect.Height,
hDC,
0,
0,
TernaryRasterOperations.SRCCOPY);
}
return bmp;
}
return null;
}
Я попробовал это в Windows Forms и WPF (с Imaging.CreateBitmapSourceFromHBitmap
), это отлично работает в обоих случаях для одного и того же скриншота (страница SO в Firefox).
HTH,