title: Bitmap.LockBits error "Parameter is not valid" when bitmap is a certain size?
body: <p>I have create a method where I want to take an image mask and apply it to another image. If you have a look at this <a href="https://stackoverflow.com/questions/13349507/overlay-image-with-png-as-mask-using-net-and-javascript">post</a>, you will see a frame image. The frame image in that post is the <code>maskingImage</code> and the background image is the <code>imageToMask</code>. The masking image is really an image with a hot pink center.  This is the process the method goes through:</p>
  
  <ol>
  <li>The masking image is a PNG and the image to mask is a JPG. </li>
  <li>The method traces the masking image and draws the image to mask over it. This helps keep the outer transparency intact.</li>
  <li>The output form that is then drawn underneath the masking image and we make the hot pink color transparent.</li>
  </ol>
  
  <p>The line <code>var bitsimageToMask = imageToMask.LockBits...</code> is where I get my error. If the width or height of the image to mask is smaller than the masking image, I get the "Parameter is not valid" error. I am a newbie when it comes to working with bitmaps.</p>
  
  <pre><code>public Bitmap RenderMaskedImage(Bitmap maksingImage, Bitmap imageToMask, Point imageToMaskOffset, ImageFormat imageFormat)
  {
      using (var newImageToMaskGraphic = Graphics.FromImage(imageToMask))
      {
      newImageToMaskGraphic.DrawImage(imageToMask, imageToMaskOffset);
      }
  
      var output = new Bitmap(maksingImage.Width, maksingImage.Height, PixelFormat.Format32bppArgb);
      var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
      var bitsMask = maksingImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
      var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
      var bitsOutput = output.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
  
      unsafe
      {
          for (int y = 0; y &lt; maksingImage.Height; y++)
          {
              var ptrMask = (byte*)bitsMask.Scan0 + y * bitsMask.Stride;
              var ptrimageToMask = (byte*)bitsimageToMask.Scan0 + y * bitsimageToMask.Stride;
              var ptrOutput = (byte*)bitsOutput.Scan0 + y * bitsOutput.Stride;
              for (int x = 0; x &lt; maksingImage.Width; x++)
              {
                  ptrOutput[4 * x] = ptrimageToMask[4 * x];           // blue
                  ptrOutput[4 * x + 1] = ptrimageToMask[4 * x + 1];   // green
                  ptrOutput[4 * x + 2] = ptrimageToMask[4 * x + 2];   // red
                  ptrOutput[4 * x + 3] = ptrMask[4 * x + 3];        // alpha 
              }
          }
      }
  
      maksingImage.UnlockBits(bitsMask);
      imageToMask.UnlockBits(bitsimageToMask);
      output.UnlockBits(bitsOutput);
  
      using (var outputGraphic = Graphics.FromImage(output))
      {
          outputGraphic.DrawImage(maksingImage.ToTransparentColor(255,0,192), 0, 0);
      }
  
      return output;
  }
  </code></pre>