private async void CheckDarkness(Stream stream)
{
try
{
toggleReverse.IsChecked = await System.Threading.Tasks.TaskEx.Run(new Func<bool>(() =>
{
System.Drawing.Bitmap map = new System.Drawing.Bitmap(stream);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, map.Width, map.Height);
System.Drawing.Imaging.BitmapData data = map.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
IntPtr ptr = data.Scan0;
int bytes = data.Stride * map.Height;
byte[] bgr = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, bgr, 0, bytes);
float averageB = 0, averageG = 0, averageR = 0;
for (int i = 0; i < bgr.Length; i += 3)
{
averageB += bgr[i];
averageG += bgr[i + 1];
averageR += bgr[i + 2];
}
averageR /= (bgr.Length / 3);
averageG /= (bgr.Length / 3);
averageB /= (bgr.Length / 3);
const int nThreshold = 105;
var bgDelta = Convert.ToInt32((averageR * 0.299) + (averageG * 0.587) + (averageB * 0.114));
map.UnlockBits(data);
return 255 - bgDelta < nThreshold;
}));
}
catch (Exception)
{
toggleReverse.IsChecked = false;
}
}