繁体   English   中英

在图片框的图像上绘制 c#

[英]drawing on image of a picturebox c#

您好,我在图片框中绘图时遇到问题。 我正在尝试绘制一个图片框。 图片框包含一个图像。我使用 drawline 方法绘制一个正弦波。 当波浪到达图片框宽度的末端时,我使用

 g.Clear(pictureBox1.BackColor);

这清除了图片框上的波浪。但问题是它也清除了图片框的图像。我想在图像上绘制一个波浪,然后在它到达picturebox.width 并再次从初始位置开始时清除它。 请帮忙!

Graphics g;
g = pictureBox1.CreateGraphics();

g.DrawLine(System.Drawing.Pens.Crimson, ti, old_gval1, ti + trackBar1.Value, gval1);

                usb.SpecifiedDevice.SendData(OUTBuffer);    

            old_gval1 = gval1;

            ti = ti + trackBar1.Value;
            if (ti > pictureBox1.Width) { 
                ti = 0;

                g.Clear(pictureBox1.BackColor);
                g.DrawLine(System.Drawing.Pens.Gray, 0, ((pictureBox1.Height - 1) - (gnd_val) * ((pictureBox1.Height - 10) / 1023f)), pictureBox1.Width, ((pictureBox1.Height - 1) - (gnd_val) * ((pictureBox1.Height - 10) / 1023f)));
                g.DrawLine(System.Drawing.Pens.Gray,  pictureBox1.Width / 2, 0,  pictureBox1.Width/ 2,pictureBox1.Height);

            }

您可以使用 PictureBox 的一个特殊功能:

它不仅有每个人都在使用的Image ,还有一个通常被忽视的BackgroundImage Image

您可以在Image上自由绘画,并且仍然保持BackgroundImage不变。

显然,您需要在透明的位图上绘画。

这是一些代码:

// load the background image:

this.pictureBox1.BackgroundImage = new Bitmap(yourImageFileName);

// prepare the image:

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g  = Graphics.FromImage(bmp) )
{
    g.FillRectangle(Brushes.Transparent, new Rectangle(Point.Empty, bmp.Size) );
}
pictureBox1.Image = bmp;

现在画东西:

Random R = new Random();

private void button1_Click(object sender, EventArgs e)
{
    Image bmp = pictureBox2.Image;
    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.DrawEllipse(Pens.Blue, R.Next(33), R.Next(33), R.Next(500), R.Next(500));
        g.DrawEllipse(Pens.Red, R.Next(33), R.Next(33), R.Next(500), R.Next(500));
        g.DrawEllipse(Pens.White, R.Next(33), R.Next(33), R.Next(500), R.Next(500));
    }
    pictureBox2.Image = bmp;
}

当您的绘图到达右边缘时,您将使用调用FillRectangle(Brushes.Transparent,..来清除前景图像并重置您的 x 值。

听起来像是解决您问题的最便宜的解决方案。

您在这里有两个选择。

  1. 您可以使用Graphics.FromImage从图像创建Graphics.FromImage ,然后将图像分配给图片框。
  2. 使用Graphics.DrawImage将图像绘制到新的Graphics对象中。

听起来后者可能更适合您,因为您实际上并没有改变内存中的图像。 因此,每次清除Graphics实例时,只需在Image绘制即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM