/// <summary>
        /// Creates image from matrix (using parallel.for)
        /// </summary>
        /// <param name="matrix">input RGBMatrix</param>
        /// <param name="outputPath">output image path</param>
        public static void CreateImageFromMatrixParalleled(RGBMatrix matrix, string outputPath)
        {
            var width  = matrix.Width;
            var height = matrix.Height;
            var bitmap = new Bitmap(width, height);

            Parallel.For(0, height, (int i) =>
            {
                for (int j = 0; j < width; j++)
                {
                    var pixel          = (UnsafeRGBMatrixData)matrix.GetValue(j, i);
                    var safeRedValue   = ConvertColorValueToSafeValue(pixel.Red);
                    var safeGreenValue = ConvertColorValueToSafeValue(pixel.Green);
                    var safeBlueValue  = ConvertColorValueToSafeValue(pixel.Blue);
                    bitmap.SetPixel(j, i, Color.FromArgb(safeRedValue, safeGreenValue, safeBlueValue));
                }
            });

            bitmap.Save(outputPath);
            bitmap.Dispose();
        }
        /// <summary>
        /// Creates RGBMatrix matrix from image
        /// </summary>
        /// <param name="imagePath"></param>
        /// <returns>Matrix containing image data</returns>
        public static IMatrix CreateMatrixFromImage(string imagePath)
        {
            var bitmapImage = new Bitmap(imagePath);
            var width       = bitmapImage.Width;
            var height      = bitmapImage.Height;

            IMatrixData[][] rgbValues = new IMatrixData[height][];

            for (int i = 0; i < height; i++)
            {
                rgbValues[i] = new IMatrixData[width];

                for (int j = 0; j < width; j++)
                {
                    var pixel = bitmapImage.GetPixel(j, i);
                    rgbValues[i][j] = new UnsafeRGBMatrixData(pixel.R, pixel.G, pixel.B);
                }
            }

            var matrix = new RGBMatrix(rgbValues);

            return(matrix);
        }