解释了相同大小的两个图像中的 Alpha 混合 here 。我们如何对两个不同尺寸的图像实现这一点。例如:前景为 600x400 像素 PNG,背景为 700x380 像素 JPG。在提到的链接中,两个图像的大小相同。
最佳答案
首先,调整大小不是一个好主意。除非两个图像一起调整大小(这不能解决问题),否则调整大小将以不期望的方式改变最终结果(例如,前景对象将显得比预期大)。
Alpha 混合通常用于将前景元素添加到背景图像中。因此,我会固定背景图像的大小,并将其视为输出图像的大小。在应用程序中,可能需要让前景退出背景图像,但这是一个特定的应用程序,需要更多的输入(如何扩展背景边框?)。
由于背景图像具有固定大小,因此我们需要一种方法来处理较小图像的 Alpha 混合。考虑简化的情况,其中较小(前景)图像与较大(背景)图像在点 (0,0) 处对齐。然后,您可以迭代背景图像,检查它是否与前景图像重叠,如果重叠,则将它们混合。
解决一般情况会引入另一个问题:定位。您需要知道在哪里放置前景元素。这需要一些额外的输入。
给定较小的图像和您想要放置它的位置,您可以使用以下算法对较大的图像进行 Alpha 混合:
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
表示应用于前景图像的平移,即红点的坐标:
关于python - 在不同尺寸的两幅图像中进行 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953418/