我遇到了一个问题,努力了解PIL(枕头)坐标如何处理更具体的椭圆形状。我想将椭圆移动到图像的特定位置。到目前为止,当我尝试更改坐标时,它只是伸展和扭曲,这就是我所设法解决的。
椭圆的尺寸比是128高度x 128宽度+ 40,这是它的样子: 但是,它不在我想要的首选位置。
这是我在油漆中模拟的一个,作为我要放置椭圆的一个例子。
这就是我正在使用的东西:
# Avatar border
w, h = (128, 128)
im_draw.ellipse((28, 0, w + 40 + 28, h + 40), fill=f"{ctx.message.author.color}")
下面的完整代码
im = Image.new("RGBA", (900, 296), (44, 44, 44, 255))
im_draw = ImageDraw.Draw(im)
f = discord.File(f"progress_bar.png", f"progress_bar.png")
# User name
im_draw.text((350, 15), ctx.message.author.display_name, font=self.medium_font, fill=(255, 255, 255, 255))
# Level
lvl_text = f"LEVEL {lvl}"
im_draw.text((350, 74), lvl_text, font=self.medium_font, fill=(255, 255, 255, 255))
# XP Progress Text
xp_text2 = f"{human_format(xp)} / {human_format(round(need_xp - xp))} XP"
im_draw.text((30, 224), xp_text2, font=self.xsmall_font, fill=(255, 255, 255, 255))
# XP progress bar
progress = xp / round((500 + 100 * lvl))
img = self.round_rectangle((895, 20), 0, (64, 64, 64, 255))
im.paste(img, (2, 275), img)
img2 = self.round_rectangle((int(895 * progress), 20), 0, fill=f"{ctx.message.author.color}")
im.paste(img2, (2, 275), img2)
# Avatar border
w, h = (128, 128)
im_draw.ellipse((28, 0, w + 40 + 28, h + 40), fill=f"{ctx.message.author.color}")
Avatar
circle = Image.open("images/circle1.png")
url = ctx.message.author.avatar_url
response = requests.get(url)
img = Image.open(BytesIO(response.content))
resize = img.resize((w, h))
im.paste(resize, (48, 20), circle)
im.save("progress_bar.png")
await ctx.send(file=f)
答案 0 :(得分:0)
您的ellipse()
的第一个参数是(28, 0, w + 40 + 28, h + 40)
。这些是所谓的边界框的坐标,请参见docs。它的形状为[x0, y0, x1, y1]
,即:最左边的点,最上面的点,最右边的点和最下面的点。在您的情况下,x0 = 28且y0 = 0,因此,圆在图像的顶部,可能在图像的左侧。
如果您希望在(x, y)
大小的(w, h)
中心有一个椭圆,这就是您需要的:
w, h = (128, 128)
x, y = (28, 54)
x0 = x - int(round(w/2))
x1 = x0 + w
y0 = y - int(round(h/2))
y1 = y + h
im_draw.ellipse(xy=(x0, y0, x1, y1), fill=...)