У меня это сработало.К сожалению, это очень медленно, для огромных текстовых форматов (например, 100).
У кого-то есть идея упростить эту функцию?
Он создает этот текст, например: пример
async def createTextWithOutline(self, image, x, y, text, font, outlineAmount, textColor, shadowColor, rarity):
# create outline text
drawObject = ImageDraw.Draw(image)
for adjX in range(outlineAmount):
for adjY in range(outlineAmount):
drawObject.text((x + adjX, y + adjY), text, font=font, fill=shadowColor)
drawObject.text((x + adjX, y - adjY), text, font=font, fill=shadowColor)
drawObject.text((x - adjX, y + adjY), text, font=font, fill=shadowColor)
drawObject.text((x - adjX, y - adjY), text, font=font, fill=shadowColor)
drawObject.text((x, y), text, font=font, fill=textColor)
if rarity != None:
if 'legendary' == rarity:
color = legendaryShadowColor
elif 'epic' == rarity:
color = epicShadowColor
elif 'rare' == rarity:
color = rareShadowColor
elif 'uncommon' == rarity:
color = uncommonShadowColor
else:
color = commonInnerColor
x_list = []
y_list = []
pixels = image.load()
size = drawObject.textsize(text, font=font)
for i in range(int(x), int(x+size[0])):
for j in range(int(y), int(y+size[1])):
if pixels[i, j] == textColor + (255, ):
x_list.append(i)
y_list.append(j)
shaderHeight = size[1]//3.5
for i, j in zip(x_list, y_list):
if j < min(y_list) + shaderHeight or j > max(y_list) - shaderHeight:
pixels[i,j] = color + (255, )