2009-04-22 8 views
2

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

+0

Можем ли мы видеть ваши структуры? –

+0

его просто принимает unsigned char * и преобразует его в другой unsigned char *, вставляя 255 каждый 4-й байт. – 2009-04-22 11:42:24

ответ

3

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

+0

это в значительной степени то, что у меня было, но немного сокращает переменные. Спасибо за помощь – 2009-04-22 11:44:52