Что вы подразумеваете под ленивым?
Массив не является ленивым типом данных, что означает, что если вы хотите использовать массивы, вам нужно загрузить все пиксели во время инициализации.Если бы мы использовали одномерный массив, альтернативой было бы использовать seq<_>
, что лениво (но вы можете обращаться к элементам только последовательно).Для многомерных массивов нет ничего подобного seq<_>
, поэтому вам нужно будет использовать что-то еще.
Вероятно, самым близким вариантом будет использование трехмерного массива отложенных значений (Lazy<int>[,,]
).Это массив задержанных групповых сигналов, которые обращаются к пикселям и оцениваются только тогда, когда вы действительно читаете значение в местоположении.Вы можете инициализировать его следующим образом:
for i=0 to Width
for j=0 to Height
let point = lazy image.GetPixel(i,j)
pixels.[0,i,j] <- lazy point.Value.R
pixels.[1,i,j] <- lazy point.Value.G
pixels.[2,i,j] <- lazy point.Value.B
Фрагмент создает ленивое значение, которое читает пиксель (point
), а затем три ленивых значения, чтобы получить отдельные цветовые компоненты.При доступе к компоненту цвета оценивается значение point
(путем доступа к Value
).
Единственное отличие в остальной части вашего кода состоит в том, что вам нужно будет вызвать Value
(например, pixels.[0,10,10].Value
чтобы получить фактический компонент цвета пикселя.
Вы можете определить более сложные структуры данных (например, ваш собственный тип, который поддерживает индексирование и ленив), но я думаю, что массив ленивых значений должен быть хорошимотправная точка.