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

2022-12-09 10:35:29 +08:00
 y4nssss
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))
681 次点击
所在节点    问与答
11 条回复
momocraft
2022-12-09 10:39:57 +08:00
"半透明" 反映在你的代码哪里?

或者说如果你主动画一个不透明的黑正方形, 和现在代码的不同在哪里?
ysc3839
2022-12-09 10:39:58 +08:00
xuelu520
2022-12-09 10:44:55 +08:00
draw.rectangle((x, y, x + 300, y + 300), fill='black')
这不是黑色的吗?设置半透明的文档看下?
liyang5945
2022-12-09 10:45:11 +08:00
你这 fill 的不是 black 吗 哪来的透明
buyan3303
2022-12-09 10:45:42 +08:00
https://blog.csdn.net/diyiday/article/details/103781429:
1 、判断图片是否都是 RGBA 通道的。不是的话,需要转换一下。否则合并的图片不会透明
y4nssss
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
2022-12-09 10:57:45 +08:00
@buyan3303 试过了 最后出来的都是纯黑
reallittoma
2022-12-09 11:03:27 +08:00
建议先去了解一下什么是 Alpha 通道,然后把 fill color 设置成 (0, 0, 0, 128) 看看效果。
y4nssss
2022-12-09 11:06:03 +08:00
@reallittoma fill=(0, 0, 0, 0)) 已经修改成透明了 还是黑色
actar
2022-12-09 11:09:44 +08:00
jpg 格式的图片好像没有透明通道吧?存成 png 呢?
y4nssss
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'))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/901271

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX