直接绘制到PictureBox

时间:2015-08-30 18:01:25

标签: c# multithreading picturebox invoke

我正在开发一个屏幕共享应用,它不断运行循环并从套接字接收小帧。下一步是将它们绘制到 PictureBox 中。 当然,我使用线程因为我不想冻结ui。

这是我的代码:

 Bitmap frame = byteArrayToImage(buff) as Bitmap;//a praticular bitmap im getting from a socket.
 Bitmap current =  (Bitmap)pictureBox1.Image;
 var graphics = Graphics.FromImage(current);
 graphics.DrawImage(frame, left, top);//left and top are two int variables of course.
 pictureBox1.Image = current;

但现在我收到了一个错误:

  

对象已在其他地方使用。

在此行var graphics = Graphics.FromImage(current);

尝试Clone,创建New Bitmap(current)。仍然没有成功。

1 个答案:

答案 0 :(得分:0)

使PictureBox失效(),以便重绘自己:

Bitmap frame = byteArrayToImage(buff) as Bitmap;
using (var graphics = Graphics.FromImage(pictureBox1.Image))
{
    graphics.DrawImage(frame, left, top);
}
pictureBox1.Invalidate();

如果您需要它是线程安全的,那么:

pictureBox1.Invoke((MethodInvoker)delegate {
    Bitmap frame = byteArrayToImage(buff) as Bitmap;
    using (var graphics = Graphics.FromImage(pictureBox1.Image))
    {
        graphics.DrawImage(frame, left, top);
    }
    pictureBox1.Invalidate();
});