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 post, you will see a frame image. The frame image in that post is the maskingImage
and the background image is the imageToMask
. The masking image is really an image with a hot pink center. This is the process the method goes through:
The line var bitsimageToMask = imageToMask.LockBits...
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.
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 < 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 < 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;
}
The reason is the rect you are using on the imageToMask is bigger then the bitmap itself.
var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
The rect is used to specify the area of the bitmap which needs to be locked. This rect can be the same size or smaller than the bitmap but can not be bigger. In your case because you use the rect based on your maskingImage the rect becomes bigger than the bitmap you are using it on which gives you that error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With