Из SDK я получаю изображения, упакованные в формате пикселей BGR, то есть BGRBGRBGR
. Для другого приложения мне нужно преобразовать этот формат в планарный RGB RRRGGGBBB
.
Я использую С# .NET 4.5 32bit, и данные находятся в байтовых массивах одинакового размера.
Прямо сейчас я перебираю исходный массив и присваиваю значения BGR
соответствующим местам в целевом массиве, но это занимает слишком много времени (180 мс для 1,3-мегапиксельного изображения). Процессор, на котором выполняется код, имеет доступ к MMX, SSE, SSE2, SSE3, SSSE3.
Есть ли способ ускорить конвертацию?
изменить: вот преобразование, которое я использую:
// the array with the BGRBGRBGR pixel data
byte[] source;
// the array with the RRRGGGBBB pixel data
byte[] result;
// the amount of pixels in one channel, width*height
int imageSize;
for (int i = 0; i < source.Length; i += 3)
{
result[i/3] = source[i + 2]; // R
result[i/3 + imageSize] = source[i + 1]; // G
result[i/3 + imageSize * 2] = source[i]; // B
}
редактировать: я попытался разделить доступ к исходному массиву на три цикла, по одному для каждого канала, но это не очень помогло. Так что я открыт для предложений.
for (int i = 0; i < source.Length; i += 3)
{
result[i/3] = source[i + 2]; // R
}
for (int i = 0; i < source.Length; i += 3)
{
result[i/3 + imageSize] = source[i + 1]; // G
}
for (int i = 0; i < source.Length; i += 3)
{
result[i/3 + imageSize * 2] = source[i]; // B
}
Bump, потому что вопрос до сих пор без ответа. Любой совет очень ценится!
i++
иi*3
, а неi+=3
иi/3
. Также стоит учитывать: выполнять вышеупомянутую математическую операцию только один раз за итерацию и сохранять ее в переменной, а не выполнять ее три раза. - person Nyerguds   schedule 05.01.2018