2012-08-17 18 views
5

Bazı resimleri PIL kullanarak damgalıyorum ve metnin bir kısmını (koyu arka plan üzerinde siyah metin) okumakta zorlanıyorum. Geniş bir arka plan renkleri yelpazem var çünkü sadece metin rengini değiştiremiyorum. Metnin etrafında bir halo efekti eklemek için herhangi bir yolu var mı? ÖrneğinPython'u kullanarak Python'da metnin etrafında bir halo oluşturun?

: http://i.imgur.com/WYxSU.jpg alt metin bende ne olduğunu ve üst metin ben (kenara renkleri) almak umuyorum budur. Metin etrafında gerçekten ince bir taslaka ihtiyacım var. Herhangi bir fikir? Gerçekten bir fark yaratacağını düşünüyorsanız biraz kod yükleyebilirim, ancak bu sadece normal bir PIL ImageDraw.Draw komutudur. Teşekkürler!

+1

Metni üç kez yazdırın. Ana karenin rengi ve (-1, -1) ve (1, 1) ofsetleri ile ilk iki ve orijinal pozisyonda orijinal renk ile üçüncü. – Matthias

+2

http://mail.python.org/pipermail/image-sig/2009-May/005681.html http://stackoverflow.com/a/8050556/442650 –

+0

PIL metin için geçerli değil. –

cevap

7

çok fazla hız umurumda değil ise, kompozisyon kullanarak bunu yapabilirsiniz: Boş RGBA görüntü üzerinde halo renk ile

  1. beraberlik metni
  2. bulanıklık o
  3. ile tekrar çizmek metin rengi
  4. invert almak için bu görüntü kompozisyonu
  5. orijinal görüntü ile "birleştirme" maskesi
Örneğin

:

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

Pek çok avantajı vardır:

  • sonuç pürüzsüz ve güzel görünüyor farklı "halo"
  • almak yerine BLUR farklı filtreyi seçebilirsiniz
  • Çok büyük yazı tipleriyle bile çalışır ve hala harika görünüyor

kalın halo, böyle filtresi kullanabilir almak için:

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) 

bölüm scale = 0.1 * sum(kernel) halo kalın (küçük değerler) veya sönük (büyük değerler) yapar.

+0

Bu örnekte doğru bir taslak, örnekte olduğu gibi, daha iyi görüneceğini düşünüyorum, ancak bu bir "halo" üretmenin doğru yoludur. Tek dezavantajı, daha geniş olanı, daha az aldığınız hale getirir. PIL'in bir RGBA görüntüsünü diğerine göre daha düz bir şekilde karıştırmadığı konusunda biraz hayal kırıklığına uğradım. –

+0

Harika teşekkürler. Sadece bir soru ... bulanıklaşma çok bulanık ... siyah metin ve beyaz bulanıklık ... bulanıklık aslında siyah bir arka plan üzerinde görünmez hale geliyor. Bunu nasıl netleştirebiliriz? Belki de kalın halo ile demek istediğin şey budur? – Jonny

+0

@Jonny evet, muhtemelen bu olurdu. Veya farklı bir filtre kullanabilirsiniz (bkz. Http://pillow.readthedocs.org/en/latest/reference/ImageFilter.html), http://pillow.readthedocs.org/en/latest/reference/ImageFilter.html#PIL.ImageFilter.Kernel içindeki * scale * veya * offset * değerleriyle oynayın –

İlgili konular