c# - 从 BitmapSource 中删除 Alpha

标签 c# wpf gdi bitmapsource

我使用 BitBlt() 和 CreateBitmapSourceFromHBitmap() 来捕获窗口作为 BitmapSource,我可以将其显示在 WPF 应用程序中的 Image 元素上。但由于某种原因,它捕获的大部分应用程序都是透明的。这是正在发生的事情的源与捕获图像:

https://userpages.umbc.edu/~smyth1/images/screencap.PNG
(来源:umbc.edu)

它是灰色的,因为它所在的窗口背景是灰色的。无论我给窗口设置什么背景都会显示出来。

如何让捕获的图像更准确地反射(reflect)原始图像?

最佳答案

代码中的问题可能是由于您使用的 Win32 API 造成的(CreateCompatibleDCSelectObjectCreateBitmap...) 。我尝试使用更简单的代码,仅使用 GetDCBitBlt,它对我来说效果很好。这是我的代码:

    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 窗体和 WPF 中尝试了它(使用 Imaging.CreateBitmapSourceFromHBitmap),对于相同的屏幕截图(Firefox 中的 SO 页面),在这两种情况下都可以正常工作。

HTH,

关于c# - 从 BitmapSource 中删除 Alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738059/

相关文章:

c# - 我正在使用通用处理程序从数据库上传图像,该图像仅在用户登录时显示,但我还需要在登录页面上显示它,

c# - 为什么我们需要在 C# 中进行向上转型和向下转型?

wpf - WPF 应用程序中的 WCF 数据服务安全性

c++ - 完全透明的图像

c - 绘画代码在我的 WM_COMMAND 消息处理程序中无法正常工作

WPF 使用 TextFormattingMode ="Display"和连字符错误地测量文本宽度

c# - 中止进一步的程序执行

c# - 将 jpeg 图像转换为十六进制格式

c# - 如何使用 MVVM 更新 ContextMenu 的 ItemSource

c# - user.config 未在本地应用程序数据中生成