首页 > 解决方案 > 如何为另一个图像的不透明部分设置图像透明?

问题描述

我有两个图像:img1img2, 和img2是透明的,除了图像的一部分。

img2使用 Pillow,如何裁剪from的不透明部分img1?结果,我想获得img1透明部分,其中img2不透明。

img1并且img2大小相同。

标签: pythonpython-3.ximage-processingpython-imaging-library

解决方案


您可以将 Pillow 图像转换为 NumPy 数组,并使用矢量化操作来加快处理速度。

具有img1.png(完全不透明的随机像素)

图像1

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):

img1_mod

如果你有“平滑”的透明度,即你的 alpha 通道的值来自 的整个范围[0 ... 255],我们可以修改代码。拥有这样一个img2_smooth.png

img2_smooth

那将是修改后的代码:

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

img2_smooth_mod

希望有帮助!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
Pillow:      7.0.0
----------------------------------------

推荐阅读