Упаковка битов в C - PullRequest
       21

Упаковка битов в C

2 голосов
/ 22 апреля 2009

Я пытаюсь преобразовать изображение RGB в изображение ARGB, просто добавив 255 для альфа-канала. Мне было интересно, если есть какой-нибудь метод pack, чтобы сделать это без итерации? Поэтому, чтобы перебрать мои данные RGB и добавить 255 к каждому пикселю.

1 Ответ

3 голосов
/ 22 апреля 2009

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

...