Прежде всего, изменение размера - плохая идея.Если размеры обоих изображений не изменяются вместе (что не решит проблему), изменение размера приведет к нежелательному изменению конечного результата (например, объект переднего плана будет казаться больше, чем предполагалось).
Альфа-смешение обычно используется для добавленияэлементы переднего плана для фонового изображения.Поэтому я бы установил размер фонового изображения, а также учел размер выходного изображения.В приложениях может потребоваться, чтобы передний план выходил из фонового изображения, но это конкретное приложение, которое требует большего ввода (как расширить границы фона?).
Поскольку фоновое изображение имеет фиксированный размер,нам нужен способ справиться с альфа-смешением меньшего изображения.Рассмотрим упрощенный случай, когда меньшее (на переднем плане) изображение выравнивается с большим (на заднем плане) изображением в точке (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
Примечаниечто вычитание положения размещения изображения переднего плана в основном является переводом.
Чтобы показать эту идею визуально, чтобы получить вывод
, вы можете думать об этом, как будто изображения были одинаковымиРазмер и проверить на совпадение.Если они перекрываются, смешайте.Если они этого не делают, сохраните фон.Это может привести к чему-то вроде этого (добавлена черная рамка для отображения меньшего размера изображения на переднем плане):
Если вы не хотитеизображение переднего плана, которое будет размещено в верхнем левом углу, просто переведите его.posx
и posy
представляют перевод, примененный к изображению на переднем плане, то есть координаты красной точки: