【问题标题】:How to change opacity of rectangle in PIL?如何更改 PIL 中矩形的不透明度?
【发布时间】:2020-08-04 04:55:51
【问题描述】:

我正在尝试实现类似于下图的效果,带有半透明黑框,上面写着:Desired

忽略它们是不同图像的事实,但我想实现与上图类似的半透明矩形效果。我目前拥有的代码是:

from PIL import Image, ImageDraw

img = Image.new('RGBA', (512, 512), (255, 0, 0, 0))
draw = ImageDraw.Draw(img, 'RGBA')
shape = [(0, 512), (512, 308)]
draw.rectangle(shape, fill = 'black')

img.save('foo.png')


img2 = Image.open('final2.png')


Image.alpha_composite(img2, img).save('foo3.png')

这会产生以下输出:

Output(忽略白色边框 - 这只是一个粗略的截图)

我尝试过 putalpha,但它只会使黑色矩形变为灰色并且仍然不透明。另外,我尝试创建一个与我想要在 (512x512) 上绘制框的图像大小相同的透明图像,然后在该透明图像的底部绘制一个矩形,然后使用混合,但是图像的颜色搞砸了因为白色图像混合在顶部。

感谢任何帮助。

编辑:仍然需要帮助!

【问题讨论】:

  • 我在 the documentation 中看不到它,但显然您可以为填充 as a tuple 提供准确的 RGBA 值。
  • 做同样的事情。
  • 完全一样的东西,用灰色框代替黑色**

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


【解决方案1】:

今后请注意提供输入、输出和预期输出的图像。我在透明背景上制作了以下文本叠加层,并添加了洋红色边框,以便您可以看到其范围:

然后我将您的代码改写为:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Create new solid red background
h, w = 400, 600
bg = Image.new('RGB', (w, h), (255, 0, 0))

# Create copy and make bottom part black
dark = bg.copy()
draw  = ImageDraw.Draw(dark)
draw.rectangle((0, int(0.7*h), w, h), 0)
dark.save('dark.png')   # DEBUG

# Blend darkened copy over top of background
blended = Image.blend(bg, dark, 0.8) 
blended.save('blended.png')   # DEBUG

# Load text overlay with transparent background, paste on top and save
overlay = Image.open('text.png').convert('RGBA')
blended.paste(overlay, mask=overlay)
blended.save('result.png')

这给出了这个结果:

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2013-03-04
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多