C#位图区域已被锁定

时间:2015-09-27 10:17:55

标签: c# multithreading image-processing

我需要经常处理单个图像,并使用另一个线程(除主ui之外)来执行此操作。实际上我得到一个RGB数组,我把它变成一个Bitmap - 这是最初的第一个过程,之后我得到(从一个套接字,如果它真的有兴趣你:P)一个较小的数组,只包含在某个位置的变化,类似于三角洲。我需要每次在初始图像上应用这个rgb数组,并根据每个数组中的rgb组件进行更新。 现在这不是我的问题,这个阶段已经完成,我的主要问题是当我将它发送到锁定位图并处理它的方法时它抛出一个

  

位图区域已被锁定。

运行几秒后出错。

这是我的代码:

public void retreive()
    {
            byte[] res = decompress( ReceiveVarData(s));//receiving the array.              
            MemoryStream ms = new MemoryStream(res);//storing it in a ms.
            BinaryReader br = new BinaryReader(ms);//use binaryreader to read from it.
            Bitmap first = FirstProcess(br);              
            pictureBox1.Image =new Bitmap( first);
          //this is the initial part, the first process.
            current = first;                
           while (true)
            {
                byte[] del = ReceiveVarData(s);                 
               current = DeltaProcessing(del);
                pictureBox1.Image =  current;

            }              
    }

    Bitmap current;
    private unsafe Bitmap DeltaProcessing(byte []rgb)
    {          
      BitmapData  bmData = current.LockBits(new System.Drawing.Rectangle(0, 0, 1920,1080), System.Drawing.Imaging.ImageLockMode.ReadWrite,PixelFormat.Format32bppRgb);
      IntPtr scan0 = bmData.Scan0;

        for (int i=0;i<rgb.Length;i+=7)
        {
            int offset = BitConverter.ToInt32(rgb, i);
                byte* p = (byte*)((int)(scan0) + offset);
                p[0] = rgb[i+4];
                p[1] = rgb[i+5];
                p[2] = rgb[i+6];
                p[3] = 255;

       }

       current.UnlockBits(bmData);
        return current;

    }


      private void Form1_Load(object sender, EventArgs e)
    {  
        tl.Start();
        cl = tl.AcceptTcpClient();
        s = cl.Client;
        Thread th = new Thread(retreive);
        th.Start();
    }

如您所见,我只是循环处理图像并应用新的rgb值。 正如我前面提到的那样 - 这不是问题非常奇怪的问题是我不断得到bitmap region is already locked错误,尽管我确保在进程后每次都Unlock位图。 。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题在于您重新使用Bitmap currentpictureBox1)。当系统尝试绘制图像时,它将被锁定在DeltaProcessing函数内。

考虑使用双缓冲:

  • Bitmap firstpictureBox1

  • 相关联
  • Bitmap current 另一个存储下一张图片的位图

  • current中的内容被复制到firstpictureBox1更新currentstatic Node Insert(Node root,int value){ Node d =root; Node q = new Node(); q.left = null; q.right=null; q.data = value; while(true){ if(value<d.data){ if(d.left==null){d.left = q; return root; } else{ d= d.left ; } } else{ if(value>d.data){ if(d.right==null){d.right=q; return root;} else d = d.right; } } } } 无效。