V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
y4nssss
V2EX  ›  问与答

请教一个关于 Python 绘图的问题,我写了一段代码,随机挑选一张图片给图片中间加上一个半透明的黑色正方形,但是最后生成的图片中间黑色的正方形都是不透明的。 这是哪里出问题?了

  •  
  •   y4nssss · 2022-12-09 10:35:29 +08:00 · 793 次点击
    这是一个创建于 747 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import os
    import random
    from PIL import Image, ImageDraw

    # 随机选择当前目录中的一张图片
    image_files = [f for f in os.listdir('.') if f.endswith('.jpg')]
    image_file = random.choice(image_files)

    # 缩放图片
    im = Image.open(image_file)
    im = im.resize((900, 383))

    # 创建 ImageDraw 对象,用于绘制图形
    draw = ImageDraw.Draw(im)

    # 绘制黑色正方形
    x = im.width // 2 - 150
    y = im.height // 2 - 150
    draw.rectangle((x, y, x + 300, y + 300), fill='black')

    # 绘制白色边框
    draw.rectangle((x, y, x + 300, y + 300), outline='white')

    # 创建 000 文件夹
    if not os.path.exists('000'):
    os.mkdir('000')

    # 保存图片到 000 文件夹
    im.save(os.path.join('000', image_file))
    11 条回复    2022-12-09 11:12:55 +08:00
    momocraft
        1
    momocraft  
       2022-12-09 10:39:57 +08:00
    "半透明" 反映在你的代码哪里?

    或者说如果你主动画一个不透明的黑正方形, 和现在代码的不同在哪里?
    xuelu520
        3
    xuelu520  
       2022-12-09 10:44:55 +08:00
    draw.rectangle((x, y, x + 300, y + 300), fill='black')
    这不是黑色的吗?设置半透明的文档看下?
    liyang5945
        4
    liyang5945  
       2022-12-09 10:45:11 +08:00
    你这 fill 的不是 black 吗 哪来的透明
    buyan3303
        5
    buyan3303  
       2022-12-09 10:45:42 +08:00
    https://blog.csdn.net/diyiday/article/details/103781429:
    1 、判断图片是否都是 RGBA 通道的。不是的话,需要转换一下。否则合并的图片不会透明
    y4nssss
        6
    y4nssss  
    OP
       2022-12-09 10:57:01 +08:00
    @momocraft
    @xuelu520
    @liyang5945

    draw.rectangle((x, y, x + 300, y + 300), fill=(0, 0, 0, 0))

    修改了代码,也还是不行
    y4nssss
        7
    y4nssss  
    OP
       2022-12-09 10:57:45 +08:00
    @buyan3303 试过了 最后出来的都是纯黑
    reallittoma
        8
    reallittoma  
       2022-12-09 11:03:27 +08:00
    建议先去了解一下什么是 Alpha 通道,然后把 fill color 设置成 (0, 0, 0, 128) 看看效果。
    y4nssss
        9
    y4nssss  
    OP
       2022-12-09 11:06:03 +08:00
    @reallittoma fill=(0, 0, 0, 0)) 已经修改成透明了 还是黑色
    actar
        10
    actar  
       2022-12-09 11:09:44 +08:00
    jpg 格式的图片好像没有透明通道吧?存成 png 呢?
    y4nssss
        11
    y4nssss  
    OP
       2022-12-09 11:12:55 +08:00
    @momocraft
    @ysc3839
    @xuelu520
    @liyang5945
    @buyan3303
    @reallittoma
    @actar
    感谢 最后搞定了


    import os
    import random
    from PIL import Image
    from PIL import ImageDraw
    from PIL import ImageFilter


    # 获取当前目录下所有图片文件
    files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith(('.png', '.jpg'))]

    # 随机选择一个图片文件
    file = random.choice(files)

    # 打开图片并缩放
    image = Image.open(file)
    image = image.resize((900, 383))

    # 对图片进行高斯模糊
    image = image.filter(ImageFilter.GaussianBlur(radius=5))

    # 转换图片为 RGBA 格式
    image = image.convert('RGBA')

    # 创建一个新的画布
    canvas = Image.new('RGBA', (900, 383), (255, 255, 255, 0))

    # 计算正方形的位置
    x = (900 - 300) // 2
    y = (383 - 300) // 2

    # 在画布上绘制透明黑色正方形
    black = (0, 0, 0, 128)
    canvas.paste(black, (x, y, x+300, y+300))

    # 给正方形添加边框
    width = 5
    for i in range(width):
    draw = ImageDraw.Draw(canvas)
    draw.rectangle((x+i, y+i, x+300-i, y+300-i), outline=(0, 0, 0, 255))

    # 合并图片
    result = Image.alpha_composite(image, canvas)

    # 保存图片
    if not os.path.exists('000'):
    os.makedirs('000')
    result.save(os.path.join('000', '1.png'))
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:43 · PVG 23:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.