Алгоритм нарезки плоскостей (на месте) из массива значений RGB

У меня есть плоский массив байтовых значений RGB, который идет R1 G1 B1 R2 G2 B2 R3 G3 B3 ... Rn Gn Bn . Итак, мои данные выглядят так:

char imageData[WIDTH * HEIGHT * 3];

Но я хочу передать массив WIDTH * HEIGHT в существующую библиотеку C, которая ожидает одну плоскость этих данных. Это будет последовательность только значений R (или просто G, или просто B).

Достаточно просто выделить новый массив и скопировать данные (да). Но изображения очень большие. Если бы это была не библиотека C, но потребовался бы какой-то итерационный интерфейс для улучшения «срезанного» обхода, это было бы здорово. Но я не могу редактировать код, который вызываю ... ему нужен простой старый указатель на блок последовательной памяти.

ОДНАКО у меня есть доступ на запись к этому массиву.Жизнеспособно создать процедуру, которая сортировала бы его по цветовым плоскостям. Мне также понадобится обратное преобразование, которое вернет его обратно, но по определению тот же метод, который сортировал его по плоскостям, можно было бы применить для его сортировки.

Насколько эффективно я могу (на месте) превратить этот массив в R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn , а затем обратно? Есть какие-нибудь ненаивные алгоритмы?

7
задан HostileFork 11 December 2011 в 17:51
поделиться