public static byte[] TransformRgb24PlainSpiralMatrixToBytePlainSequentialMatrix(RGB24[] rgbPlainSpiralMatrix) { //RGB24[] rgbPlainSpiralMatrix = GetRgb24ArrayFromByteArray(plainSpiralMatrix); Int32 matrixSide = Convert.ToInt32(Math.Sqrt(rgbPlainSpiralMatrix.Length)); RGB24[] rgbPlainSequentialMatrix = new RGB24[rgbPlainSpiralMatrix.Length]; int position = 0; int count = matrixSide; int value = -matrixSide; int sum = -1; do { value = -1 * value / matrixSide; for (int i = 0; i < count; i++) { sum += value; rgbPlainSequentialMatrix[position++] = rgbPlainSpiralMatrix[matrixSide * (sum / matrixSide) + sum % matrixSide]; } value *= matrixSide; count--; for (int i = 0; i < count; i++) { sum += value; rgbPlainSequentialMatrix[position++] = rgbPlainSpiralMatrix[matrixSide * (sum / matrixSide) + sum % matrixSide]; } } while (count > 0); return(GetByteArrayFromRgb24Array(rgbPlainSequentialMatrix)); }
//Метод, который делает из линейного массива спираль в матрице, и отдаёт эту матрицу в линейном виде public static RGB24[] TransformRgb24PlainSequentialMatrixToPlainSpiralMatrix(RGB24[] plainSequentialMatrix) { Int32 matrixSide = Convert.ToInt32(Math.Sqrt(plainSequentialMatrix.Length)); RGB24[,] spiralMatrix = new RGB24[matrixSide, matrixSide]; int position = 0; int count = matrixSide; int value = -matrixSide; int sum = -1; do { value = -1 * value / matrixSide; for (int i = 0; i < count; i++) { sum += value; spiralMatrix[sum / matrixSide, sum % matrixSide] = plainSequentialMatrix[position++]; } value *= matrixSide; count--; for (int i = 0; i < count; i++) { sum += value; spiralMatrix[sum / matrixSide, sum % matrixSide] = plainSequentialMatrix[position++]; } } while (count > 0); return(spiralMatrix.Cast <RGB24>().ToArray()); }
//Метод для получения массива цветов RGB из массива байт public static RGB24[] GetRgb24ArrayFromByteArray(byte[] byteArray) { int pixelsCount = byteArray.Length / 3; RGB24[] rgb24Array = new RGB24[pixelsCount]; for (int i = 0; i < pixelsCount; i++) { Int32 currentPixelBytePosition = i * 3; rgb24Array[i] = new RGB24 { R = byteArray[currentPixelBytePosition], G = byteArray[currentPixelBytePosition + 1], B = byteArray[currentPixelBytePosition + 2] }; } return(rgb24Array); }