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都是黑色的,则进行医学图像分割