private void GetAverageColor() { ScreenService.GetScreenResolution(out var screenWidth, out var screenHeight); var size = new Size(screenWidth, screenHeight); var verticalDepth = byte.Parse(ReadTextBox(VerticalDepthSampling)); var horizontalDepth = byte.Parse(ReadTextBox(HorizontalDepthSampling)); var screenBitmap = ScreenService.CreateBitmap(screenWidth, screenHeight); var readings = ArrayService.CreateTaskByteArray(4); var timer = new Stopwatch(); do { WaitMilliseconds(100); timer.Start(); screenBitmap = ScreenService.CopyFromTheScreen(screenBitmap, size); var format = screenBitmap.PixelFormat; var bppModifier = format == PixelFormat.Format24bppRgb ? 3 : 4; // cutting corners, will fail on anything else but 32 and 24 bit images var sourceData = screenBitmap.LockBits(new Rectangle(0, 0, screenWidth, screenHeight), ImageLockMode.ReadOnly, format); var stride = sourceData.Stride; var scan = sourceData.Scan0; var readingsCount = 0; #region VerticalRight readings[readingsCount++] = SendSideRequestAsync(screenHeight, screenWidth, verticalDepth, _screenLedCount.VerticalLedCountRight, 0, scan, bppModifier, stride, false, false, false); #endregion #region HorizonalTop readings[readingsCount++] = SendSideRequestAsync(screenHeight, screenWidth, horizontalDepth, _screenLedCount.HorizontalLedCountTop, 0, scan, bppModifier, stride, false, true, true); #endregion #region VerticalLeft readings[readingsCount++] = SendSideRequestAsync(screenHeight, screenWidth, verticalDepth, _screenLedCount.VerticalLedCountLeft, 0, scan, bppModifier, stride, true, true, false); #endregion #region HorizonalBottom readings[readingsCount] = SendSideRequestAsync(screenHeight, screenWidth, horizontalDepth, _screenLedCount.HorizontalLedCountBottom, 0, scan, bppModifier, stride, true, false, true); #endregion var resultsArray = ArrayService.AwaitTaskByteArray(readings); screenBitmap.UnlockBits(sourceData); var endArray = ArrayService.ConvertToSingleArray(resultsArray); var elapsedTime = timer.ElapsedMilliseconds.ToString(); timer.Reset(); UpdateTextBox(OutputBox1, elapsedTime); SendDataToSerialPort(endArray, endArray.Length); } while (_isLEDReadingRunning); screenBitmap.Dispose(); }