将面板或表单另存为高质量图像

时间:2018-04-04 11:28:11

标签: c# winforms

我目前正在使用此代码来截屏我创建的面板,但每当我保存它时,质量都很糟糕。保存时有什么方法可以保持良好的质量吗?

我尝试调整面板大小但结果仍然相同。 我尝试使用剪切工具进行正常的屏幕截图,它与我使用的代码也有相同的结果。

有什么建议吗?或者帮忙?

private void SaveControlImage(Control theControl)
{
    snapCount++;

    int width = panel1.Size.Width;
    int height = panel1.Size.Height;

    Bitmap bm = new Bitmap(width, height, PixelFormat.Format64bppPArgb);

    panel1.DrawToBitmap(bm, new Rectangle(0, 0, width, height));
    //bm.Save(@"D:\TestDrawToBitmap.bmp", ImageFormat.Bmp);

    bm.Save(deskTopPath + @"/Offer_" + snapCount.ToString() + "_" + DateTime.Now.ToString("yyyyMMdd") + @".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}

就像在这里一样,如果你将它与你现在正在阅读的内容(比如这个网站)进行比较,它看起来像素化了。我试图屏蔽表格,但它看起来像上传的图片所以它无用

截图:

1

3 个答案:

答案 0 :(得分:0)

Windows窗体未使用矢量图形来绘制用户界面。因此,您可以获得的一切就是将控件绘制到位图而不是屏幕。这与您的控件是否在屏幕上可见无关,但不会有更多。如果您想从Windows窗体控件获得更高分辨率的图像,唯一的方法是调整控件的大小并希望它支持缩放。

答案 1 :(得分:0)

这是我用来保存屏幕截图的内容:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
private void SaveControlAsImage(Control control, string path)
{
    Bitmap bitmap = new Bitmap(control.Width, control.Height);
    control.DrawToBitmap(bitmap, control.Bounds);
    using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
    {
        /* using ImageFormat.Png or ImageFormat.Bmp saves the image with better quality */
        bitmap.Save(fs, ImageFormat.Png);
    }
}

Control screenshot using Windows Snipping Tool

Control screenshot using SaveControlAsImage (ImageFormat.Png)

Control screenshot using SaveControlAsImage (ImageFormat.Jpeg)

它不是最好的质量(只是有点模糊),但这消除了文本周围的扭曲并保持正确的颜色。

旁注:您未使用传递给方法的参数(theControl),因此您也可以将其删除(不推荐),或将所有调用更改为panel1方法theControl并调用方法

this.SaveControlImage(this.panel1);

此外,当您只访问某个属性(即this.panel1.Size.Width)时,最好只调用该属性而不是将其分配给变量。如果您正在调用方法并获取值(您将使用多次),则必须将其分配给变量(即int arrayCount = array.Count())。

答案 2 :(得分:0)

Bitmap bmp= new Bitmap(controls.Width, controls.Height-50, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics Grap = Graphics.FromImage(bmp);

Grap.CopyFromScreen(PointToScreen(controls.Location).X, PointToScreen(controls.Location).Y, 0, 0, AnhDoThi.Size, CopyPixelOperation.SourceCopy);
SaveFileDialog save = new SaveFileDialog();
save.Filter = "JPEG|*.jpg";
DialogResult tl = save.ShowDialog();
if (tl == DialogResult.OK)
{
    bmp.Save(save.FileName);
    MessageBox.Show("Completed !");
}