Альфа-смешение в разном размере два изображения - PullRequest
1 голос
/ 02 мая 2019

Альфа-смешение в одном и том же размере объясняется двумя изображениями здесь .Как мы реализуем это для двух разных размеров изображений.Пример: 600x400 пикселей PNG для переднего плана и 700x380 пикселей JPG для заднего плана.В указанной ссылке оба изображения имеют одинаковый размер.

foreground image background image

1 Ответ

3 голосов
/ 02 мая 2019

Прежде всего, изменение размера - плохая идея.Если размеры обоих изображений не изменяются вместе (что не решит проблему), изменение размера приведет к нежелательному изменению конечного результата (например, объект переднего плана будет казаться больше, чем предполагалось).

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

Поскольку фоновое изображение имеет фиксированный размер,нам нужен способ справиться с альфа-смешением меньшего изображения.Рассмотрим упрощенный случай, когда меньшее (на переднем плане) изображение выравнивается с большим (на заднем плане) изображением в точке (0,0).Затем вы можете перебирать фоновое изображение, проверять, перекрывает ли оно изображение переднего плана, и, если это так, смешивать их.

Решение общих случаев приводит к другой проблеме: позиционированию.Вам нужно знать , где , чтобы разместить элемент переднего плана.Это требует некоторого дополнительного ввода.

Учитывая меньшее изображение и положение, в котором вы хотите разместить его, вы можете альфа-смешиваться с большим изображением, используя алгоритм следующим образом:

let posx and posy be the placement position of the foreground image
let foreground.sizex and foreground.sizey the size of the foreground image
for each row of the background image
    for each column of the background image
        // check if the position overlaps the foreground image
        if column - posx >= 0 and column - posx < foreground.sizex
            if row - posy >= 0 and row - posy < foreground.sizey
                 alpha blend the background and the foreground
        else
            output background value

Примечаниечто вычитание положения размещения изображения переднего плана в основном является переводом.

Чтобы показать эту идею визуально, чтобы получить вывод

enter image description here

, вы можете думать об этом, как будто изображения были одинаковымиРазмер и проверить на совпадение.Если они перекрываются, смешайте.Если они этого не делают, сохраните фон.Это может привести к чему-то вроде этого (добавлена ​​черная рамка для отображения меньшего размера изображения на переднем плане):

enter image description here

Если вы не хотитеизображение переднего плана, которое будет размещено в верхнем левом углу, просто переведите его.posx и posy представляют перевод, примененный к изображению на переднем плане, то есть координаты красной точки:

enter image description here

...