【问题标题】:How to save drawing Graphics to bitmap?如何将绘图图形保存到位图?
【发布时间】:2018-08-28 15:29:37
【问题描述】:

我想将我对图形所做的更改保存到位图文件。我在pictureBox中有来自相机的图像,当我点击鼠标时,我添加网格并指向图像(在图像前面,据我所知),之后我想用相机的img保存绘图图形,但我只取img 没有绘制网格和点。我该怎么做? 我创建这样的图形:

 g = Graphics.FromHwnd(postureImg.Handle);
 SolidBrush brush_Grey = new SolidBrush(Color.Black);
 SolidBrush brush_Gold = new SolidBrush(Color.Gold);                   
 Rectangle rect = new Rectangle(dPoint1, new Size(10, 10));
 g.FillEllipse(brush_Gold, rect);                   

 points[i] = new Point(e.X, e.Y);
       i++;
       if (i >= 2)
       {
        Pen myPen = new Pen(Color.Red);
        myPen.Width = 1;
        g.DrawLine(myPen, points[0].X, points[0].Y, points[1].X, points[1].Y);
        }
        g.Dispose();

下次我制作 g.DrawLine 和 g.FillEllipse 并得到这样的图像: 如何将此图像转换为位图?谢谢帮忙!

【问题讨论】:

  • 您应该显示made with Graphics 部分的代码
  • 我添加了这部分代码。
  • Image控件的容器是什么?
  • pictureBox 容器

标签: c# winforms graphics picturebox


【解决方案1】:

好的,关于你在做什么的快速教程。

首先,Graphics 对象?它所做的只是修改您指向的原始图像/位图。在这种情况下,您正在修改包含在您的姿势Img 中的原始图像/位图。这就是您不必将图片“重新导入”回该图片框的原因 - 因为图形正在就地修改它。

这意味着,之后,您所要做的就是将原始图像/位图保存到文件中 - 所以您真正要问的是:“如何保存位于PictureBox 到文件?”

在这种情况下,答案很简单:

postureImg.Image.Save(@"C:\someplace.jpg", ImageFormat.Jpeg);

编辑:啊,我忘记了 VS 用 PicBoxes 做了一些奇怪的事情——它有一个“实际”图像和一个“显示”图像。您一直在编辑的是“显示”图像,它不是持久的(如果表单刷新,它会消失。)

老实说,如果你从不直接从图片框中的图像开始,你可能会过得更好。例如,下面的代码不起作用

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
SolidBrush brush_Grey = new SolidBrush(Color.Green);
SolidBrush brush_Gold = new SolidBrush(Color.Red);
Rectangle rect = new Rectangle(new Point(100, 100), new Size(10, 10));
g.FillEllipse(brush_Gold, rect);
g.Dispose();
pictureBox1.Image.Save(@"C:\tmpSO1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

...它不起作用的一个很好的线索是,如果您在表单加载时执行此操作,它将不会显示红色圆圈;如果由于裁剪等原因必须刷新表单,红色圆圈将消失。

无论如何,这里的代码确实有效:

Bitmap bmp = new Bitmap(pictureBox1.Image);
Graphics g = Graphics.FromImage(bmp);
SolidBrush brush_Grey = new SolidBrush(Color.Green);
SolidBrush brush_Gold = new SolidBrush(Color.Red);
Rectangle rect = new Rectangle(new Point(100, 100), new Size(10, 10));
g.FillEllipse(brush_Gold, rect);
g.Dispose();
pictureBox1.Image = bmp;
pictureBox1.Image.Save(@"C:\tmpSO2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

不是在原地修改 PictureBox,而是从其中加载一个单独的 BMP,然后再返回到其中。

【讨论】:

  • 我只采用没有网格的默认图像和用图形绘制的点。在问问题之前我已经尝试过了。
  • 也可以保持bmp不变,然后pictureBox1.Image = null; pictureBox1.Image = bmp;刷新图片框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多