4

我使用 PIL 在图像上添加了一些文本

我想添加一个文本阴影,具有一定的阴影半径和阴影不透明度。

在我绘制一些文本之前,我已经能够通过绘制阴影来伪造它(它不太好用),然后将它放置在文本上方一点点。

    draw.text((x, y + 2), text, font = some_font, fill = (208,208,208)) #shadow
    draw.text((x, y), text, font = some_font, fill = (255,255,255)) #text

但是,这种方法不允许阴影半径、不透明度 css 样式的属性。

有没有更好的方法来使用 Python 创建文本阴影?如果是这样,怎么做?

4

3 回答 3

8

看看这些例子。

示例 1

示例 2

最后一个与您尝试的有点相似。

import Image, ImageFont, ImageDraw

import win32api, os

x, y = 10, 10

fname1 = "c:/test.jpg"
im = Image.open(fname1)
pointsize = 30
fillcolor = "red"
shadowcolor = "yellow"

text = "hi there"

font = win32api.GetWindowsDirectory() + "\\Fonts\\ARIALBD.TTF"
draw = ImageDraw.Draw(im)
font = ImageFont.truetype(font, pointsize)

# thin border
draw.text((x-1, y), text, font=font, fill=shadowcolor)
draw.text((x+1, y), text, font=font, fill=shadowcolor)
draw.text((x, y-1), text, font=font, fill=shadowcolor)
draw.text((x, y+1), text, font=font, fill=shadowcolor)

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

# now draw the text over it
draw.text((x, y), text, font=font, fill=fillcolor)

fname2 = "c:/test2.jpg"
im.save(fname2)

os.startfile(fname2)
于 2013-09-24T08:44:35.537 回答
1

您最好的选择是:

  1. 创建一个RGBA格式的新图像/图层,初始 alpha 设置为完全透明,
  2. 将您的文本按原样添加到其中,并将文本 alpha 设置为完全不透明,
  3. 复制文本层,
  4. 按你的影子方向移动它,
  5. 按你的阴影比例因子缩放它,
  6. 将文本的颜色替换为具有阴影密度 alpha的阴影颜色。
  7. 然后将阴影合并/粘贴到原始图像上
  8. 然后在文本层上合并/粘贴。
于 2013-09-24T11:49:35.307 回答
0

添加一个 3-5 宽的灰色阴影:

for i, j in itertools.product((-3, 0, -3), (-5, 0, 5)):
    PIL.ImageDraw.Draw(image).text((x + i, y + j), text, font=font, fill="gray")
PIL.ImageDraw.Draw(image).text((x, y), text, "white", font)
于 2021-10-13T06:09:24.693 回答