Удалить альфу из BitmapSource - PullRequest
1 голос
/ 15 ноября 2009

Я использую BitBlt () и CreateBitmapSourceFromHBitmap (), чтобы захватить окно как BitmapSource, которое я могу отобразить в элементе Image в приложении WPF. Но по какой-то причине большая часть записываемого приложения является прозрачной. Вот источник против захвата изображения того, что происходит:

https://userpages.umbc.edu/~smyth1/images/screencap.PNG
(источник: umbc.edu )

Он серый, потому что фон окна, в котором он находится, серый. Какой бы фон я ни дал окну, он просвечивает.

Как получить полученное изображение для более точного отражения оригинала?

1 Ответ

4 голосов
/ 15 ноября 2009

Проблема в вашем коде может быть связана с 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).

НТН,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...