截图质量比平时差

时间:2015-01-09 15:38:43

标签: c# winforms screenshot

我想抓住我屏幕的一部分。 问题是,即使我使用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);
        }

编辑:

示例图像形式我使用代码: enter image description here

普通屏幕截图:

enter image description here

这里看起来并没有那么不同,但这是最糟糕的。

3 个答案:

答案 0 :(得分:4)

您问题中的顶部图片已重新缩放,小于原始图像。这在包含精细细节的图像中很明显,例如用于使文本更具可读性的ClearType消除锯齿像素。当他们重新调整时,视觉效果会被破坏,文字看起来会更糟糕。

完全不清楚为什么图像被重新调整,代码中的任何内容都不会导致这种情况。通过使用调试器检查bmp.Horizo​​ntalResolution属性进行仔细检查,它应该与视频适配器的DPI匹配。最简单的解释是,它是通过您使用的任何图像查看程序完成的,也许是为了使图像适合窗口。尝试缩小。

答案 1 :(得分:0)

如果可以使用外部库,我建议你 FMUtils.Screenshot 。它可以作为NuGet包使用。

我刚尝试过,质量就像是Windows的标准屏幕截图。这是一个简短的例子:

new ComposedScreenshot(new Rectangle(0, 0, 100, 100)).ComposedScreenshotImage.Save(@"PATH_TO_FILE\example-screenshot.png", ImageFormat.Png);

希望这有帮助!

答案 2 :(得分:-1)

您使用的像素格式仅对不同的颜色通道使用8位。您可以尝试使用PixelFormat64bppARGB获得每种颜色16位。

PixelFormat枚举的资源:http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat%28v=vs.110%29.aspx