枕头坐标(PIL)有问题

时间:2020-10-22 19:25:38

标签: python-3.x python-imaging-library discord.py

我遇到了一个问题,努力了解PIL(枕头)坐标如何处理更具体的椭圆形状。我想将椭圆移动到图像的特定位置。到目前为止,当我尝试更改坐标时,它只是伸展和扭曲,这就是我所设法解决的。

椭圆的尺寸比是128高度x 128宽度+ 40,这是它的样子: 但是,它不在我想要的首选位置。

enter image description here

这是我在油漆中模拟的一个,作为我要放置椭圆的一个例子。

enter image description here

这就是我正在使用的东西:

                # 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)

1 个答案:

答案 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=...)