使用 PIL 创建多级椭圆

Create multi-level ellipses with PIL

我想用 PIL 创建多级椭圆。这个想法,是不是必须在中心椭圆处是一个全白的(255),随着它向外生长,应该有一个渐变,慢慢变成黑色(0)

出于某种原因,它没有在中心创建白色像素。我使用 getpixel 函数

进行了验证
from PIL import Image, ImageDraw

width = 1200
height = 1200
img = Image.new("L", (width, height)) # 1200pixels imitating 1 X 1 feet

max_width = 600#imitating 6 inches
max_height = 150# imitating 1.5 inches

eX, eY = max_width, max_height
for i in range(256):
    bbox = (width/2 - eX/2, height/2 - eY/2, width/2 + eX/2, height/2 + eY/2)
    draw = ImageDraw.Draw(img)
    draw.ellipse(bbox, fill=i)
    eX = eX - 1
    eY = eY - 1
img.save("new.png")
print (img.getpixel(xy=(600,600)))

当我打印我应该得到的值 - 255,但输出是 148。

https://ibb.co/51cggfj

因为您总是在每次迭代中将 eY 变量减少 1,所以在完成循环之前达到零高度。不绘制没有高度的椭圆,因此您只能看到最后一个正高度是最亮颜色(不是白色)的窄线。

要解决此问题,您可能需要以其他方式缩放尺寸。例如,您可以在循环的顶部用这个替换所有 eXeY 计算:

# no need to initialize eX and eY before the loop
for i in range(256):
    eX, eY = max_width * 256 / (256-i), max_height * 256 / (256-i)  # compute scaled values
    bbox = (width/2 - eX/2, height/2 - eY/2, width/2 + eX/2, height/2 + eY/2)
    draw = ImageDraw.Draw(img)
    draw.ellipse(bbox, fill=i)
    # no longer subtract from eX and eY down here

这是一种与您之前所做的不同类型的缩放,如果您愿意,您可以坚持使用更像您之前所做的事情,您只需要调整逻辑以仅达到 eY 的 1 就在最后。