Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将面板或窗体另存为高质量图像_C#_Winforms - Fatal编程技术网

C# 将面板或窗体另存为高质量图像

C# 将面板或窗体另存为高质量图像,c#,winforms,C#,Winforms,我目前正在使用这段代码来截屏我创建的面板,但每当我保存它时,质量都很差。保存时有没有办法保持良好的质量 我试着调整面板的大小,但结果还是一样。 我试着用剪贴工具做一个普通的屏幕截图,它也有我使用的代码相同的结果 有什么建议吗?还是帮忙 private void SaveControlImage(Control theControl) { snapCount++; int width = panel1.Size.Width; int height = panel1.Siz

我目前正在使用这段代码来截屏我创建的面板,但每当我保存它时,质量都很差。保存时有没有办法保持良好的质量

我试着调整面板的大小,但结果还是一样。 我试着用剪贴工具做一个普通的屏幕截图,它也有我使用的代码相同的结果

有什么建议吗?还是帮忙

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);
}

就像这里,如果你把它和你现在正在读的东西(比如这个网站)相比,它看起来是像素化的。我试图屏蔽表单,但它看起来像上传的图片,所以它是无用的

截图:


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

这是我用来保存屏幕截图的方法:

这不是最好的质量(只是有点模糊),但这样可以消除文本周围的失真并保持正确的颜色

旁注:您没有使用传递给方法的参数(
control
),因此您最好将其删除(不推荐),或者将方法中对
panel1
的所有调用更改为
control
,并调用类似的方法

this.SaveControlImage(this.panel1);

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

可以尝试类似于超级采样的方法,将宽度和高度乘以我建议的4-16左右的某个因子。不确定它是否会以更高的分辨率缩放或实际渲染控件,但值得一试。
我尝试使用剪切工具进行普通屏幕截图,并且它与我使用的代码也有相同的结果
>你的意思是表单的屏幕截图已经很糟糕了吗?那么,可能是形式本身已经“看起来很糟糕”了吗?我的意思是,除非你以有损格式保存截图,否则表单的任何截图实际上都应该与屏幕上显示的表单一模一样…@KennethChang你能添加一些截图吗?(当然还有结果)你试过.png格式吗?如果压缩模型更适合这种位图,那么屏幕截图包含文本,因此决不能保存为jpg,而jpg仅适用于photgraphs。改用png。另外:屏幕上的文本通常是抗锯齿的,以使其看起来窒息。有时,脱离上下文并放大后,这看起来就不那么好了。。
this.SaveControlImage(this.panel1);
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 !");
}