python - 如何为另一个图像的不透明部分设置图像透明?
问题描述
我有两个图像:img1
和img2
, 和img2
是透明的,除了图像的一部分。
img2
使用 Pillow,如何裁剪from的不透明部分img1
?结果,我想获得img1
透明部分,其中img2
不透明。
img1
并且img2
大小相同。
解决方案
您可以将 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
----------------------------------------
推荐阅读
- excel - 无法弄清楚如何索引、匹配和使用表中组合的 if 函数
- unit-testing - 在 Artos 中配置并行测试
- xpages - 如何使用 SSJS 从外部休息服务获取返回值
- javascript - 需要我发布到 npm 的包时遇到问题
- ip-camera - 在 ubuntu 的 OpenCV 中访问我的 ip wifi 摄像头,并且不会连接/流式传输
- jquery - 在 jQuery UI datepicker dateFormat 中允许使用破折号和斜杠
- google-apps-script - 适用于所有打开以适应屏幕以适应受保护工作表范围的用户的 google 工作表宏
- java - 如何根据使用 JSoup 选择的 JList 下载文件?
- r - 在 scale_x_discrete 中创建下标
- mysql - MySql:查找类型中每个产品子类型的最近日期