屏幕截图质量比正常差
Screen shoot quality worse than normal
我正在尝试截取屏幕的一部分。
问题是即使我使用 png 保存图像,质量仍然比我只使用普通打印屏幕差。
这是我使用的代码:
//display a save file dialog for the user to set the file name
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "PNG (*.png)|*.png";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
//if the user proceed saving the picture
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
//simplify code with constant numbers for demo
//get the width of the panel we need the screenshoot off
int x = 10;
//get the height of the panel we need the screenshoot off
int y = 10;
//create the ractangle of the screenshoot panel
Rectangle rect = new Rectangle(x, y, 5, 5);
//create new bitmap
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
//get the screenshoot of the panel
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
string fileName = saveFileDialog.FileName;
if (!fileName.Contains(".png"))
fileName += ".png";
bmp.Save(fileName, ImageFormat.Png);
}
编辑:
我用代码拍摄的示例图片:
普通截图:
这里看起来没什么不同,但是最差。
您使用的像素格式仅对不同的颜色通道各使用 8 位。您可以尝试使用 PixelFormat64bppARGB 来获得每种颜色 16 位。
关于 PixelFormat 枚举的资源:http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat%28v=vs.110%29.aspx
您问题中的顶部图片已重新缩放,比原始图片小。这在包含精细细节的图像中很明显,例如用于使文本更具可读性的 ClearType 抗锯齿像素。当它们被重新缩放时,视觉效果被破坏并且文本看起来更糟。
完全不清楚为什么图像被重新缩放,您的代码中的任何内容都不会导致这种情况。使用调试器仔细检查 bmp.HorizontalResolution 属性,它应该与您的视频适配器的 DPI 相匹配。最简单的解释是它是由您使用的任何图像查看程序完成的,也许是为了使图像适合 window。尝试缩小。
如果可以使用外部库,我建议你FMUtils.Screenshot。它作为 NuGet 包提供。
我刚刚试了一下,质量就像 windows 的标准截图一样。这是一个简短的例子:
new ComposedScreenshot(new Rectangle(0, 0, 100, 100)).ComposedScreenshotImage.Save(@"PATH_TO_FILE\example-screenshot.png", ImageFormat.Png);
希望对您有所帮助!
我正在尝试截取屏幕的一部分。 问题是即使我使用 png 保存图像,质量仍然比我只使用普通打印屏幕差。
这是我使用的代码:
//display a save file dialog for the user to set the file name
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "PNG (*.png)|*.png";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
//if the user proceed saving the picture
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
//simplify code with constant numbers for demo
//get the width of the panel we need the screenshoot off
int x = 10;
//get the height of the panel we need the screenshoot off
int y = 10;
//create the ractangle of the screenshoot panel
Rectangle rect = new Rectangle(x, y, 5, 5);
//create new bitmap
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
//get the screenshoot of the panel
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
string fileName = saveFileDialog.FileName;
if (!fileName.Contains(".png"))
fileName += ".png";
bmp.Save(fileName, ImageFormat.Png);
}
编辑:
我用代码拍摄的示例图片:
普通截图:
这里看起来没什么不同,但是最差。
您使用的像素格式仅对不同的颜色通道各使用 8 位。您可以尝试使用 PixelFormat64bppARGB 来获得每种颜色 16 位。
关于 PixelFormat 枚举的资源:http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat%28v=vs.110%29.aspx
您问题中的顶部图片已重新缩放,比原始图片小。这在包含精细细节的图像中很明显,例如用于使文本更具可读性的 ClearType 抗锯齿像素。当它们被重新缩放时,视觉效果被破坏并且文本看起来更糟。
完全不清楚为什么图像被重新缩放,您的代码中的任何内容都不会导致这种情况。使用调试器仔细检查 bmp.HorizontalResolution 属性,它应该与您的视频适配器的 DPI 相匹配。最简单的解释是它是由您使用的任何图像查看程序完成的,也许是为了使图像适合 window。尝试缩小。
如果可以使用外部库,我建议你FMUtils.Screenshot。它作为 NuGet 包提供。
我刚刚试了一下,质量就像 windows 的标准截图一样。这是一个简短的例子:
new ComposedScreenshot(new Rectangle(0, 0, 100, 100)).ComposedScreenshotImage.Save(@"PATH_TO_FILE\example-screenshot.png", ImageFormat.Png);
希望对您有所帮助!