Сглаживание слоев изображения - PullRequest
1 голос
/ 13 января 2012

Я работаю над базовым инструментом для редактирования изображений с поддержкой слоев, и мне нужно знать, как объединить слои в одно изображение. Очевидно, что если у пикселей нет альфа-значения, то выигрывает тот, который находится сверху, но я не знаю, что делать, когда у пикселей есть альфа-значения. Итак, вот вопрос: учитывая два (или более) пикселя, представленных с использованием значений RGBA, как мне объединить их в один пиксель в этом контексте (слоях)?

ТИА

1 Ответ

2 голосов
/ 13 января 2012

Для каждого компонента в слое, если значение альфа равно a (диапазон 0..1), тогда вы увидите пропорцию a этого компонента + пропорцию 1-a того, что под ним.

Попробуйте перейти от нижнего слоя к верхнему.

EDIT:

#define MAX_PIXEL 255

int numLayers; // Number of layers.
Color* layers; // Pointer to the layers.

Color flattened;

flattened.R = 0;
flattened.G = 0;
flattened.B = 0;
flattened.A = MAX_PIXEL;

// Layer 0 is the bottom layer.
for (int i = 0; i < numLayers; i++) {
    int alpha;

    alpha = layers[i].A;

    flattened[i].R = (layers[i].R * alpha + flattened[i].R * (MAX_PIXEL - alpha)) / MAX_PIXEL;
    flattened[i].G = (layers[i].G * alpha + flattened[i].G * (MAX_PIXEL - alpha)) / MAX_PIXEL;
    flattened[i].B = (layers[i].B * alpha + flattened[i].B * (MAX_PIXEL - alpha)) / MAX_PIXEL;
}
...