I am trying to parallelize an operation on an image using the code below , but I get an One or more errors occurred
error.
Looking into the inner exception I can see the error {"Object is currently in use elsewhere."}
has occurred.
Note: CoverImage
and SecretImage
are Bitmap
s
Parallel.For(0, CoverImage.Width, x =>
{
for (int y = 0; y < CoverImage.Height; y++, SecretImageHeight++)
{
Color coverImagesPixel = CoverImage.GetPixel(x, y);
Color secretImagesPixel = SecretImage.GetPixel(SecretImageWidth, SecretImageHeight);
int r = (coverImagesPixel.R & coverImageMask) + ((secretImagesPixel.R >> shift) & secretImageMask);
int g = (coverImagesPixel.G & coverImageMask) + ((secretImagesPixel.G >> shift) & secretImageMask);
int b = (coverImagesPixel.B & coverImageMask) + ((secretImagesPixel.B >> shift) & secretImageMask);
StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
}
SecretImageHeight = 0;
SecretImageWidth++;
}
);
I tried using a mutex like this :
mutex.WaitOne();
StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
mutex.ReleaseMutex();
But still to no avail (I get the same error).
It looks like you're trying to use image APIs from non-UI threads. That's a bad idea.
I suggest you copy the image to a byte array on the UI thread, then run your parallel for loop which would mutate the array, then recreate the image afterwards from the byte array.
See more on this question at Stackoverflow