使用PIL在文本中应用不同颜色

13

你好,想要使用不同的选项绘制三个不同的文本,例如:

  1. 文本1,字体=arial,颜色=红色
  2. 文本2,字体=veranda,颜色=蓝色,大小=30
  3. 文本3,字体=tahoma,颜色=绿色,大小=40,对齐方式=center

每个文本需要单独占一行。

def pil_image(request):
text = request.GET.get('text', None)
font = str(request.GET.get('font', 'arial'))
fontsize = int(request.GET.get('fontsize', '20'))
textcolor = str(request.GET.get('textcolor', '000'))

import Image, ImageDraw, ImageFont, textwrap

img = Image.open('media/text/transparent.png')
img = img.convert("RGBA")
datas = img.getdata()
w, h = img.size

newData = []
for item in datas:
    if item[0] == 255 and item[1] == 255 and item[2] == 255:
        newData.append((255, 255, 255, 0))
    else:
        newData.append(item)

img.putdata(newData)

draw = ImageDraw.Draw(img)
font = ImageFont.truetype("media/text/fonts/" + font + ".ttf", fontsize, encoding="unic")


margin = offset = 40
for line in textwrap.wrap(text, width=48):
    w, h = draw.textsize(line)
    draw.text((margin, offset), line, font=font, fill='#'+textcolor)
    offset += font.getsize(line)[1]

del draw 

img.save("media/text/custom.png", "PNG")

return HttpResponse("<img src='/media/text/custom.png'>");

1
你需要提供一个你尝试过的例子,或者至少是你在理解或解决问题方面遇到的概念性问题。Stack Overflow并不是为你完成作业的地方。 - Silas Ray
1
现在我添加了代码,正在使用。 - Frankenstein Palinskij
3个回答

23
“fill”参数应该是一个包含4个数字的元组,因为你使用的是RGBA颜色模式。
对于不透明的红色:
draw.text((margin, offset), line, font=font, fill=(255,0,0,255) )

1
它是BGRA而不是RGBA(即(255,0,0,255)是蓝色,而不是红色) - Binyamin Even

5

请使用十六进制颜色值,如下所示:

draw.text((margin, offset), line, font=font, fill="#000")

3
只需这样做。
# thicker border
draw.text((x-1, y-1), text, font=font, fill=shadowcolor)
draw.text((x+1, y-1), text, font=font, fill=shadowcolor)
draw.text((x-1, y+1), text, font=font, fill=shadowcolor)
draw.text((x+1, y+1), text, font=font, fill=shadowcolor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接