在python中对具有透明背景的图像的一部分应用线性透明渐变

Apply linear transparent gradient to a portion of image with transparent background in python

我只需要对图像底部的 5% 应用线性透明渐变。我有一些想法,首先我需要在 alpha 通道上创建遮罩。但我不确定如何才能做到只影响图像底部 5% 的效果。到目前为止,我已经尝试过不同的方法但没有运气。渐变应从图像高度的 5% 开始,alpha 为 100%,最后为 alpha 为 0%。此外,图像可以是具有透明背景的非矩形 PNG。我真的很感激任何帮助。谢谢你。 Here 是我需要的示例。但它可以是矩形或非矩形图像。

这是 Python/OpenCV/Numpy 中针对不透明图像执行此操作的一种方法。

 - Read the input
 - Compute top and bottom heights for the alpha channel
 - Create a constant white image for top
 - Create a vertical gradient going from 255 to 0 for the bottom
 - Stack the top and bottom parts
 - Convert the image to 4 channels BGRA
 - Replace the alpha in the BGRA image with the stacked alpha
 - Save the result

输入:

import cv2
import numpy as np

# read image
img = cv2.imread("lena.png")
ht, wd = img.shape[:2]

# compute 5% of ht and 95% of ht
# pct = 5
pct = 25    # temparily set pct to 25 percent for demonstration
ht2 = int(ht*pct/100)
ht3 = ht - ht2

# create opaque white image for top
top = np.full((ht3,wd), 255, dtype=np.uint8)

# create vertical gradient for bottom
btm = np.linspace(255, 0, ht2, endpoint=True, dtype=np.uint8)
btm = np.tile(btm, (wd,1))
btm = np.transpose(btm)

# stack top and bottom
alpha = np.vstack((top,btm))

# put alpha channel into image
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:,:,3] = alpha

# save result
cv2.imwrite('lena_fade.png', result)

# display results
# (note: display does not show transparency)
cv2.imshow('btm', btm)
cv2.imshow('alpha', alpha)
cv2.imshow('result', result)
cv2.waitKey(0)

结果:

加法

以下是在 ImageMagick 7 中的操作方法。

magick lena.png \
-set option:wd "%w" \
-set option:ht "%h" \
-set option:ht2 "%[fx:round(25*ht/100)]" \
-set option:ht3 "%[fx:ht-ht2]" \
\( -size "%[wd]x%[ht3]" xc:white \) \
\( -size "%[wd]x%[ht2]" gradient:white-black \) \
\( -clone 1,2 -append \) \
-delete 1,2 \
-alpha off -compose copy_opacity -composite \
lena_fade2.png

结果图像:

以下是在 ImageMagick 7 中执行此操作的方法(无论输入中是否有现有的 alpha 通道)。它略有不同。您基本上从输入中提取 alpha 通道并将其与包含渐变的通道相乘。然后将新的通道放入原始图像中,替换现有的 alpha 通道。

输入:

magick lena_circle.png \
-alpha set \
-set option:wd "%w" \
-set option:ht "%h" \
-set option:ht2 "%[fx:round(0.25*ht)]" \
-set option:ht3 "%[fx:ht-ht2]" \
\( -size "%[wd]x%[ht3]" xc:white \) \
\( -size "%[wd]x%[ht2]" gradient:white-black \) \
\( -clone 1,2 -append \) \
-delete 1,2 \
\( -clone 0 -alpha extract \) \
\( -clone 1,2 -compose multiply -composite \) \
-delete 1,2 \
-alpha off -compose copy_opacity -composite \
lena_circle_fade3.png

结果图像: