Tiny WPF app converting image(BitmapImage) using Greyscale input params in async/await manner.
I read dozen of implementations and did not manage to make it work :/
Button method:
private async void btnConvertImage_ClickAsync(object sender, RoutedEventArgs e)
{
try
{
var cts = new CancellationTokenSource();
BitmapImage result = await ImageProcessing.GreyscaleAsync(orginalImage, cts.Token).ConfigureAwait(false);
imgPhotoConverted.Source = result;
}
}
Greyscale Task definition:
public static async Task<BitmapImage> GreyscaleAsync(BitmapImage inputBitmapImage, CancellationToken cancellationToken)
{
return await Task.Run(() =>
{
Bitmap inputBitmap = ToBitmap(inputBitmapImage);
Bitmap outputImage = new Bitmap(inputBitmap.Width, inputBitmap.Height);
for (int i = 0; i < inputBitmap.Width; i++)
{
for (int x = 0; x < inputBitmap.Height; x++)
{
cancellationToken.ThrowIfCancellationRequested();
Color imageColor = inputBitmap.GetPixel(i, x);
int grayScale = (int)((imageColor.R * 0.21) + (imageColor.G * 0.72) + (imageColor.B * 0.07));
Color newColor = Color.FromArgb(imageColor.A, grayScale, grayScale, grayScale);
outputImage.SetPixel(i, x, newColor);
}
}
return ToBitmapImage(outputImage);
}, cancellationToken);
}
On line:
imgPhotoConverted.Source = result;
an error is thrown:
System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'