C# 在画框上画画

C# 在画框上画画,c#,multithreading,image,C#,Multithreading,Image,假设我有一个指定了图像的PictureBox,我只想在上面画一个较小的位图 这是我的代码: Bitmap a = Getimage();//just a small function generates a new image. Bitmap f = (Bitmap) pictureBox1.Image;//getting the picturebox image. Graphics g = Graphics.FromImage(f); g.DrawImage(a,150,200);//

假设我有一个指定了图像的PictureBox,我只想在上面画一个较小的位图

这是我的代码:

 Bitmap a = Getimage();//just a small function generates a new image.
 Bitmap f = (Bitmap) pictureBox1.Image;//getting the picturebox image.
 Graphics g = Graphics.FromImage(f);
 g.DrawImage(a,150,200);//draws a on f at (150,200).
 PictureBox1.Image=f;
但是,在我的程序中,它在一个单独线程的循环中运行,因此我得到一个错误:

对象正在其他地方使用

有没有办法直接绘制到Picturebox本身?而不是得到它的位图和绘图,并再次分配?或者至少我该如何解决上述异常

谢谢。

这对你有帮助

    public Form1()
    {
        InitializeComponent();
        new Thread(MyDraw).Start();
    }

    private void MyDraw()
    {
        while(true)
        {
            Invoke(new Action(DrawItem));
            Thread.Sleep(1000);
        }
    }

    private void DrawItem()
    {
        using (var graphics = Graphics.FromImage(pictureBox1.Image))
        {
            graphics.DrawString("Hello", new Font("Arial", 20), Brushes.Yellow, PointF.Empty);
        }
    }

调用控件。在PictureBox上调用,并确保处理图形和Bitmap@Bauss仍然得到相同的错误-使用这个:pictureBox1.Invokenew Action=>pictureBox1.Image=f;映像不是线程安全的。您必须同时在一个线程上锁定并使用映像:@VMAtm好的。。但是我总是只使用一个线程。你说过这是在单独的线程中运行的。因此,您有两个线程同时使用此图像:UI和您的背景这违背了创建新线程的目的,因为图形仍然发生在UI线程上。绘图应在单独的线程中进行,然后将数据传递给UI线程。如果有一个线程创建一些数据,然后在UI线程的位图上绘制该数据,则示例代码非常有用。如果希望实际绘制发生在UI线程之外,则需要创建一个新位图,在其上绘制,将其保存为内存中的流,然后从该流在UI线程中重新创建位图,尽管我怀疑仅在UI线程中重新创建要比仅在UI线程中绘制慢。在大多数情况下,在UI线程中绘图速度很快,不会引起明显的UI冻结。@Alireza在创建图形时,异常对象正在其他地方使用。。。。这到底是为什么也许这是第二次运行循环。在第一次运行中,将创建图形对象,而不是将其释放。在第二次运行中,无法在第一个图形使用的同一位图上创建新图形