Вопрос
Я пытаюсь преобразовать RGB-изображение в ARGB-изображение, в основном просто добавляя 255 для альфа-канала.Мне было интересно, есть ли какой-нибудь пакетный метод для выполнения этого без итерации?Итак, чтобы перебрать мои данные RGB и добавить 255 к каждому пикселю.
Решение
В C нет "методов" ...И нет, это не похоже ни на что, для чего есть процедура в стандартной библиотеке.Я думаю, вам нужно закодировать это самостоятельно, используя что-то вроде этого:
void setAlpha(unsigned char *rgba, int width, int height, int alpha)
{
int x, y;
for(y = 0; y < height; y++)
{
for(x = 0; x < width; x++, rgba += 4)
{
rgba[3] = (unsigned char) alpha;
}
}
}
Основные допущения:
- Порядок упаковки - это RGBA в памяти, т. е.смещение равно 3 к альфа-байту, от начала пикселя.
- Изображение сохраняется с верхним левым пикселем по исходному адресу в порядке справа налево, сверху вниз.
- Там нет отступов или чего-то еще
Также обратите внимание на порядок следования циклов;это может иметь огромное значение для реальной производительности из-за кэширования.Этот код последовательно затрагивает пиксели, расположенные близко в памяти, что хорошо называется "хорошей локальностью".
Изменение указателя так, чтобы он указывал на следующий пиксель, а не указывал адрес (rgba[4 * y * width + 4 * x + 3]
) также является оптимизацией, и (для меня) ее достаточно легко понять.