首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIL中背景与透明图像的融合

PIL中背景与透明图像的融合
EN

Stack Overflow用户
提问于 2012-03-31 05:26:59
回答 2查看 9.9K关注 0票数 6

我有一个png图像作为背景,我想添加一个透明的网格到这个背景,但这并不像预期的那样工作。背景图像在我应用透明网格的地方被转换为透明的。

我正在做:

代码语言:javascript
复制
from PIL import Image, ImageDraw

map_background = Image.open(MAP_BACKGROUND_FILE).convert('RGBA')
map_mesh = Image.new('RGBA', (width, height), (0, 0, 0, 0))
draw = ImageDraw.Draw(map_mesh)

# Create mesh using: draw.line([...], fill=(255, 255, 255, 50), width=1)
...

map_background.paste(map_mesh, (0, 0), map_mesh)

但结果是:

如果你仔细观察,你可以看到棋盘图案(在图形程序中用作无背景)。透明线条使得背景层在两个层相交的地方也是透明的。但我只希望在背景上添加透明线。

我可以用以下方法来解决:

代码语言:javascript
复制
map_background.paste((255,255,255), (0, 0), map_mesh)

但由于我对不同的线条使用不同的颜色,所以我必须在这个过程中为每种颜色制作。如果我有100种颜色,那么我需要100层,这不是很好的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2012-04-01 02:17:27

您要做的是将网格合成到背景上,为此,您需要使用Image.blendImage.composite。下面是使用后者将带有随机alpha值的红色线条合成到白色背景上的示例:

代码语言:javascript
复制
import Image, ImageDraw, random
background = Image.new('RGB', (100, 100), (255, 255, 255))
foreground = Image.new('RGB', (100, 100), (255, 0, 0))
mask = Image.new('L', (100, 100), 0)
draw = ImageDraw.Draw(mask)
for i in range(5, 100, 10):
    draw.line((i, 0, i, 100), fill=random.randrange(256))
    draw.line((0, i, 100, i), fill=random.randrange(256))
result = Image.composite(background, foreground, mask)

从左到右:

*背景*前景

(如果您愿意将结果写回背景图像,则可以使用Paulo Scardine在已删除答案中指出的Image.paste的掩码版本之一。)

票数 11
EN

Stack Overflow用户

发布于 2013-12-27 00:56:09

我很难让上面的例子很好地工作。相反,这对我来说是有效的:

代码语言:javascript
复制
import numpy as np
import Image
import ImageDraw

def add_craters(image, craterization=20.0, width=256, height=256):

    foreground = Image.new('RGBA', (width, height), (0, 0, 0, 0))
    draw = ImageDraw.Draw(foreground)

    for c in range(0, craterization):
        x = np.random.randint(10, width-10)
        y = np.random.randint(10, height-10)
        radius = np.random.randint(2, 10)
        dark_color = (0, 0, 0, 128)
        draw.ellipse((x-radius, y-radius, x+radius, y+radius), fill=dark_color)

    image_new = Image.composite(foreground, image, foreground)
    return image_new
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9950634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档