Вручную альфа-смешение RGBA-пикселя с пикселем RGB - программирование
Подтвердить что ты не робот

Вручную альфа-смешение 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). Должен ли я проверить, есть ли альфа для каждого пикселя, и если да, то сделайте смесь или есть другой способ сделать это?

4b9b3361

Ответ 1

Типичная смесь "Over" выполняется следующим образом:

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha));

И затем повторяется для синих и зеленых каналов. Сделайте это для каждого пикселя.

Ответ 2

Кажется, что вы упустили (1-Alpha) множитель для фона (currentPixelColor)