Вот вариант ответа jdweng, который генерирует массивы 4x4 и обрабатывает исходные массивы, которые не делятся на 4. Вы можете понять, почему он опубликовал упрощенный образец. Еще больше, и для заполнения массива 4x4 стоило бы использовать еще два цикла.
'image' - это ввод, 'bytes4x4' - это вывод.
List<List<List<byte>>> bytes4x4 = new List<List<List<byte>>>();
for (int row = 0; row<length-3 ; row += 4)
{
for (int col = 0; col<width-3; col += 4)
{
bytes4x4.Add(new List<List<byte>>() {
new List<byte>() { image[row, col], image[row, col + 1], image[row, col + 2], image[row, col + 3]},
new List<byte>() { image[row + 1, col], image[row + 1, col + 1], image[row + 1, col + 2], image[row + 1, col + 3] },
new List<byte>() { image[row + 2, col], image[row + 2, col + 1], image[row + 2, col + 2], image[row + 2, col + 3] },
new List<byte>() { image[row + 3, col], image[row + 3, col + 1], image[row + 3, col + 2], image[row + 3, col + 3] }
});
}
Это объявляет и заполняет 'bytes4x4', который является длинным списком двумерных блоков. Доступ к блоку, как это:
var block100 = bytes4x4[100];
И используйте это, чтобы получить пиксель:
var block100pixelrow1col3 = block100[1][3];
или
var block100pixelrow1col3 = bytes4x4[100][1][3];
Обратите внимание, что все эти индексы основаны на нулях, поэтому в блоках нет элемента [4].
Теперь я думаю об этом, вы можете быть после 2-мерного массива 2-мерных блоков. Если это так, код будет выглядеть так:
var bytes4x4 = new List<List<List<List<byte>>>>();
for (int row = 0; row<length-3 ; row += 4)
{
var row = new List<List<List<byte>>>();
bytes4x4.Add(row);
for (int col = 0; col<width-3; col += 4)
{
row.Add(new List<List<byte>>() {
new List<byte>() { image[row, col], image[row, col + 1], image[row, col + 2], image[row, col + 3]},
new List<byte>() { image[row + 1, col], image[row + 1, col + 1], image[row + 1, col + 2], image[row + 1, col + 3] },
new List<byte>() { image[row + 2, col], image[row + 2, col + 1], image[row + 2, col + 2], image[row + 2, col + 3] },
new List<byte>() { image[row + 3, col], image[row + 3, col + 1], image[row + 3, col + 2], image[row + 3, col + 3] }
});
}
Тогда вы можете получить доступ к блоку, который на 14 строк ниже и на 23 столбца такой:
var block14by23 = bytes4x4[14][23];