【问题标题】:How to set image transparent for non-transparent part from another image?如何为另一个图像的不透明部分设置图像透明?
【发布时间】:2020-05-31 19:42:06
【问题描述】:

我有两张图片:img1img2,而img2 除了图片的一部分之外是透明的。

使用 Pillow,如何从img1 中裁剪出img2 的不透明部分?因此,我想得到带有透明部分的img1,其中img2 是不透明的。

img1img2 大小相同。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @Brian 我从头到尾(逐行)遍历所有像素,并在 img2 中逐像素检查和透明度,它有效,但我想知道有没有比这个更好的解决方案 n^ 2 解决方案。
  • 考虑使用edit 将您编写的代码添加到您的问题中。

标签: python python-3.x image-processing python-imaging-library


【解决方案1】:

您可以将 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
----------------------------------------

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 2011-07-20
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多