您可以将 Pillow 图像转换为 NumPy 数组,并利用矢量化操作来加快处理速度。
拥有img1.png(完全不透明的随机像素)
和img2.png(完全透明的背景像素,完全不透明的红色像素)
可以使用这种方法来实现所描述的行为:
import numpy as np
from PIL import Image
# Open images via Pillow
img1 = Image.open('img1.png')
img2 = Image.open('img2.png')
# Convert images to NumPy arrays
img1_np = np.array(img1)
img2_np = np.array(img2)
# Get (only full) opaque pixels in img2 as mask
mask = img2_np[:, :, 3] == 255
# Make pixels in img1 within mask transparent
img1_np[mask, 3] = 0
# Convert image back to Pillow
img1 = Image.fromarray(img1_np)
# Save image
img1.save('img1_mod.png')
修改后的img1_mod.png 看起来像这样(完全不透明的随机背景像素,img2.png 中有红色方块的透明像素):
如果您有“平滑”的透明度,即您的 Alpha 通道的值来自 [0 ... 255] 的整个范围,我们可以修改代码。有这样的img2_smooth.png
那是修改后的代码:
import numpy as np
from PIL import Image
# Open images via Pillow
img1 = Image.open('img1.png')
img2 = Image.open('img2_smooth.png')
# Convert images to NumPy arrays
img1_np = np.array(img1)
img2_np = np.array(img2)
# Get (also partially) opaque pixels in img2 as mask # <--
mask = img2_np[:, :, 3] > 0 # <--
# Make pixels in img1 within mask (partially) transparent # <--
img1_np[mask, 3] = 255 - img2_np[mask, 3] # <--
# Convert image back to Pillow
img1 = Image.fromarray(img1_np)
# Save image
img1.save('img1_smooth_mod.png')
那将是新的输出 img1_smooth_mod.png:
希望有帮助!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.1
NumPy: 1.18.1
Pillow: 7.0.0
----------------------------------------