Bitmap.Save整个法师都是黑色的,不只是背景[重复]

Posted

技术标签:

【中文标题】Bitmap.Save整个法师都是黑色的,不只是背景[重复]【英文标题】:Bitmap.Save the whole mage is black, not just the background [duplicate] 【发布时间】:2016-07-25 17:08:56 【问题描述】:

我目前正在使用 PrintWindow 截取外部应用程序的屏幕截图,我想将其保存到我的桌面。

这是我的代码:

// Get proc
            Process proc = Process.GetProcessesByName("procName").Single();
            IntPtr hWnd = proc.MainWindowHandle;

            // Restore proc if minimised
            int style = GetWindowLong(hWnd, GWL_STYLE);
            if ((style & WS_MINIMIZE) == WS_MINIMIZE)
                ShowWindow(hWnd, WindowShowStyle.Restore);

            // Get RECT
            RECT rect;
            GetWindowRect(new HandleRef(this, hWnd), out rect);

            // Get screenshot
            int width = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;
            Bitmap bmp = new Bitmap(width, height);
            using (Graphics g = Graphics.FromImage(bmp))
            
                IntPtr dc = g.GetHdc();

                if (!PrintWindow(hWnd, dc, 0))
                
                    int error = Marshal.GetLastWin32Error();
                    var exception = new System.ComponentModel.Win32Exception(error);
                    Debug.WriteLine("ERROR: " + error + ": " + exception.Message);
                    return;
                

                //Thread.Sleep(200);
                bmp.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.jpeg", ImageFormat.Jpeg);
                panel1.BackgroundImage = bmp;
                g.ReleaseHdc(dc);
            

panel1 向我展示了良好的图像,即应用程序的实际屏幕截图。当我转到我的桌面时,我找到了一个 test.jpeg,但它全是黑色的。为什么?

谢谢!

【问题讨论】:

对他来说,只有背景是黑色的。对我来说,整个图像都是黑色的 ".. JPEG 图像默认为黑色背景,因此如果您的文本颜色也是黑色,您将获得黑色图像。如果您的图像没有背景颜色,您必须将其保存为 PNG .." From Saved Bitmap is black 我的图片是应用程序的屏幕截图,它确实包含黑色文本,但不仅仅是黑色文本。 我们无法看到 PrintWindow() 方法中发生了什么。 它是一个user32 API方法,基本上它只是筛选应用程序并将其保存在图形对象中,就像我说的那样,图像在panel1中显示良好,但保存后全黑跨度> 【参考方案1】:

通过将代码更改为,我成功地将其保存为 .jpg:

// Get screenshot
            int width = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;
            Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            using (Graphics g = Graphics.FromImage(bmp))
            
                g.Clear(Color.White);
                IntPtr dc = g.GetHdc();

                if (!PrintWindow(hWnd, dc, 0))
                
                    int error = Marshal.GetLastWin32Error();
                    var exception = new System.ComponentModel.Win32Exception(error);
                    Debug.WriteLine("ERROR: " + error + ": " + exception.Message);
                    return;
                

                g.ReleaseHdc(dc);
            

            // Save the screenshot
            bmp.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.jpg", ImageFormat.Jpeg);
            panel1.BackgroundImage = bmp;

【讨论】:

不要忘记处置panel1.BackgroundImage 分配给它的旧位图对象。通常我会做类似var temp = panel1.BackgroundImage; panel1.BackgroundImage = bmp; if(temp != null) temp.Dispose();

以上是关于Bitmap.Save整个法师都是黑色的,不只是背景[重复]的主要内容,如果未能解决你的问题,请参考以下文章

白魔法师

从 VB 转换为 C#:bitmap.save() 参数错误

新纪元的法师——程序员

如果整个ground truth都是黑色的,则进行医学图像分割

bitmap.save 将其 pixelFormat 更改为 32 位深度

C# Bitmap.Save 将图像作为路径保存到其他位置