Вопрос

Я пытаюсь преобразовать 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]) также является оптимизацией, и (для меня) ее достаточно легко понять.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top