Se non si cura di velocità troppo, puoi farlo utilizzando la composizione: testo
- pareggio con il colore alone sull'immagine un vuoto
RGBA
- sfocatura è
- disegnare di nuovo con testo di colore
- invertito questa immagine per ottenere la composizione mascherare
- "merge" immagine originale con
Ad esempio:
import sys
import Image, ImageChops, ImageDraw, ImageFont, ImageFilter
def draw_text_with_halo(img, position, text, font, col, halo_col):
halo = Image.new('RGBA', img.size, (0, 0, 0, 0))
ImageDraw.Draw(halo).text(position, text, font = font, fill = halo_col)
blurred_halo = halo.filter(ImageFilter.BLUR)
ImageDraw.Draw(blurred_halo).text(position, text, font = font, fill = col)
return Image.composite(img, blurred_halo, ImageChops.invert(blurred_halo))
if __name__ == '__main__':
i = Image.open(sys.argv[1])
font = ImageFont.load_default()
txt = 'Example 1234'
text_col = (0, 255, 0) # bright green
halo_col = (0, 0, 0) # black
i2 = draw_text_with_halo(i, (20, 20), txt, font, text_col, halo_col)
i2.save('halo.png')
Ha molti vantaggi:
- il risultato è liscio e sembra piacevole
- è possibile scegliere il filtro diverso, invece di
BLUR
per ottenere diversi "alone"
- funziona anche con caratteri molto grandi e sembra ancora bello
Per ottenere alone più spessi, si può utilizzare il filtro in questo modo:
kernel = [
0, 1, 2, 1, 0,
1, 2, 4, 2, 1,
2, 4, 8, 4, 1,
1, 2, 4, 2, 1,
0, 1, 2, 1, 0]
kernelsum = sum(kernel)
myfilter = ImageFilter.Kernel((5, 5), kernel, scale = 0.1 * sum(kernel))
blurred_halo = halo.filter(myfilter)
La parte scale = 0.1 * sum(kernel)
rende l'aureola più spesso (piccoli valori) o dimmer (grandi valori).
Stampa il testo tre volte. I primi due con il contorno e gli offset di (-1, -1) e (1, 1) e il terzo con il colore originale nella posizione originale. – Matthias
http://mail.python.org/pipermail/image-sig/2009-May/005681.html http://stackoverflow.com/a/8050556/442650 –
PIL.ImageDraw ha un'opzione 'outline' ma non è valido per il testo. –