title: Marshal.Copy() is not copying to bitmap
body: <p>I'm working on an image processing project, and I've read that the fastest way to manipulate a bitmap image is to copy it from a byte array using Marshal.Copy(). However, for whatever reason, nothing is being copied from my byte array to my Bitmap, and there's not a clear reason why. This is the code I'm using to copy into my Bitmap: </p>
  
  <pre><code>    public void UpdateImage()
      {
          var data = image.LockBits(
              new Rectangle(Point.Empty, image.Size),
              ImageLockMode.WriteOnly, 
              PixelFormat.Format32bppArgb);
  
          Marshal.Copy(backBuffer, 0, data.Scan0, backBuffer.Length);
          image.UnlockBits(data);
          Console.WriteLine("UpdateImage");//For debugging purposes
      }
  </code></pre>
  
  <p>I'm attempting to fill the image with complete black, and looking at the data of the backBuffer, it appears to be correct, and as expected, where as when I check any pixel of 'image' it is completely blank. I have no idea why nothing is happening. Any advice would be much appreciated!</p>
  
  <p>Edit: I apologize, I'm a bit new around here, let me provide some more information. Specifically, I am working on some GPU accelerated image processing using Cloo/OpenCL. I wanted to fill the screen with black to make sure that I am doing things correctly, although I am evidently not. Here is the entire class file I'm using: </p>
  
  <pre><code>    public class RenderTarget
  {
      public GraphicsDevice GraphicsDevice;
      private byte[] backBuffer;
      public Bitmap image;
  
      private ComputeKernel fillKernel;
      private ComputeProgram fillProgram;
  
      public void UpdateImage()
      {
          var data = image.LockBits(
              new Rectangle(Point.Empty, image.Size),
              ImageLockMode.WriteOnly, 
              PixelFormat.Format32bppArgb);
  
          Marshal.Copy(backBuffer, 0, data.Scan0, backBuffer.Length);
          image.UnlockBits(data);
          Console.WriteLine("UpdateImage");
      }
  
      //Test method ONLY
      public void FillScreen(Color color)
      {
          if (fillProgram == null)//temporary, all kernels should be compiled on start up. In fact, these probably should be static
          {
              string fillText = @"
                  kernel void fillScreen(global uchar* data_out, int from, int to, uchar a, uchar r, uchar g, uchar b){
                      for (int i = from; i &lt; to; i += 4){
                          data_out[i] = a;
                          data_out[i + 1] = r;
                          data_out[i + 2] = g;
                          data_out[i + 3] = b;
                      }
                  }";
  
              fillProgram = new ComputeProgram(GraphicsDevice.context, fillText);
  
              fillProgram.Build(null, null, null, IntPtr.Zero);
  
              fillKernel = fillProgram.CreateKernel("fillScreen");
          }
  
          ComputeBuffer&lt;byte&gt; backBufferBuffer = new ComputeBuffer&lt;byte&gt;(GraphicsDevice.context, ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.UseHostPointer, backBuffer);
  
          fillKernel.SetMemoryArgument(0, backBufferBuffer);
  
          for (int i = 0; i &lt; backBuffer.Length / 10000; i++)
          {
              fillKernel.SetValueArgument&lt;int&gt;(1, i * 10000);
              fillKernel.SetValueArgument&lt;int&gt;(2, (i + 1) * 10000);
              fillKernel.SetValueArgument&lt;byte&gt;(3, color.A);
              fillKernel.SetValueArgument&lt;byte&gt;(4, color.R);
              fillKernel.SetValueArgument&lt;byte&gt;(5, color.G);
              fillKernel.SetValueArgument&lt;byte&gt;(6, color.B);
  
              GraphicsDevice.queue.ExecuteTask(fillKernel, null);
          }
  
          GraphicsDevice.queue.ReadFromBuffer(backBufferBuffer, ref backBuffer, false, null);
  
          GraphicsDevice.queue.Finish();
      }
  
      public RenderTarget(int Width, int Height, GraphicsDevice device)
      {
          image = new Bitmap(Width, Height);
          backBuffer = new byte[4 * Width * Height];
          GraphicsDevice = device;
  
          //Fill the screen with black
          FillScreen(Color.Black);
          UpdateImage();
          Console.WriteLine(image.GetPixel(0, 0).A);
      }
  }
  </code></pre>
  
  <p>I have checked to make absolutely sure that the backBuffer is correct. (The values I expected were 255, 0, 0, 0 for the first four elements of the backBuffer). </p>