Ручное альфа-смешение пикселя RGBA с пикселем RGB

Я пытаюсь выполнить операцию альфа-смешения изображения RGBA (изображение переднего плана) на изображение RGB (фоновое изображение). Однако при этом я думаю, что, возможно, выполняю неправильную операцию альфа-смешивания или делаю это неправильно. Например, пиксель моего изображения RGB сероватого цвета (127, 127, 127). Пиксель моего изображения RGBA для пикселя будет (0, 0, 255). После того, как я выполню операцию смешивания, окончательный цвет будет (127, 0, 255). Однако я подумал, что это скорее смесь добавок и отличная от той операции, которую я выполняю.

Чтобы узнать, как устанавливаются мои значения, взгляните на это

incPixelColor[0] = 0; (red)
incPixelColor[1] = 0; (green)
incPixelColor[2] = 255; (blue)
incPixelColor[3] = 255; (alpha)

currentPixelColor[0] = 127; (red)
currentPixelColor[1] = 127; (green)
currentPixelColor[2] = 127; (blue)

Чтобы узнать, как устанавливаются мои вычисления, взгляните на это

float incAlpha = (currentPixelColor[3]/255.0f);

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f);
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f);
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f);


currentPixelColor[0] = min(red * 255, 255.0f);
currentPixelColor[1] = min(green * 255, 255.0f);
currentPixelColor[2] = min(blue * 255, 255.0f);

Для пикселей без альфа-канала я бы хотел, чтобы значение было (0, 0, 255), то для изображений с альфа-каналом я бы хотел, чтобы он сливался. В конце операции, описанной выше, это будет (127, 127, 255). Должен ли я проверить, есть ли альфа для каждого пикселя, и если да, то сделать смешивание или есть другой способ сделать это?

21
задан mmurphy 26 January 2012 в 06:43
поделиться