17

Değişen ancak bilinen boyutlardaki görüntülere yerleştirilecek metni dinamik olarak ölçeklendirmeye çalışıyorum. Metin filigran olarak uygulanacaktır. Metni görüntü boyutlarına göre ölçeklendirmenin herhangi bir yolu var mı? Metnin tüm yüzey alanını kaplamasını, sadece kolayca görülebilmesini ve böylece kolayca tanımlanabilmesini ve kaldırılmasını zorlaştırmasını istemiyorum. Python Imaging Library 1.1.7 sürümünü kullanıyorum. Linux'ta.PIL Görüntü boyutuna göre metin boyutunu ölçeklendirme

Metin boyutunun görüntü boyutlarına oranını, boyutun 1/10'u gibi bir şey gibi söyleyebilmeyi isterim.

Boyutu değiştirmek için yazı tipi boyutu özelliğine bakıyordum, ancak ölçeklendirmek için bir algoritma oluşturmada hiç şansım olmadı. Daha iyi bir yol olup olmadığını merak ediyorum.

Bunu nasıl başarabileceğime dair herhangi bir fikir var mı?

sayesinde Genelde

cevap

37

Yalnızca bir uygunluk bulana kadar yazı tipi boyutunu artırabilirsiniz. font.getsize(), oluşturulmuş metnin ne kadar büyük olduğunu size bildiren işlevdir. Bu sizin için yeterli verimli değilse

import ImageFont, ImageDraw, Image 

image = Image.open('hsvwheel.png') 
draw = ImageDraw.Draw(image) 
txt = "Hello World" 
fontsize = 1 # starting font size 

# portion of image width you want text width to be 
img_fraction = 0.50 

font = ImageFont.truetype("arial.ttf", fontsize) 
while font.getsize(txt)[0] < img_fraction*image.size[0]: 
    # iterate until the text size is just larger than the criteria 
    fontsize += 1 
    font = ImageFont.truetype("arial.ttf", fontsize) 

# optionally de-increment to be sure it is less than criteria 
fontsize -= 1 
font = ImageFont.truetype("arial.ttf", fontsize) 

print 'final font size',fontsize 
draw.text((10, 25), txt, font=font) # put the text on the image 
image.save('hsvwheel_txt.png') # save it 

, bir kök bulma düzeni uygulayabilirsiniz ama font.getsize() işlevi resim düzenleme süreçlerine geri kalanına kıyasla küçük patates olduğunu tahmin ediyorum.

+4

Merhaba Paul, bu hile yaptı. Yardım için teşekkürler – Shpongle

5

sen onun yazı boyutunda bir doğrusal değişiklik olmayacak boyutlandırma yazı tipini değiştirin.

Non-linear Scaling

Şimdi bu genellikle yazılım, yazı tipleri, vb ... Bu örnek Typophile alındı ​​bağlıdır ve lateks + Bilgisayar Modern yazı tipini kullanır. Tam olarak bir lineer ölçekleme görmediğiniz gibi. Yani, doğrusal olmayan yazı tipi ölçekleme ile sorun yaşıyorsanız, o zaman nasıl çözeceğimi bilmiyorum, ancak bir öneri belki de.

  1. istediğiniz boyuta kadar yakın yazı Render, o ölçek yukarı/aşağı, normal resim ölçekleme algoritması aracılığıyla ...
  2. Sadece tam olarak doğrusal ölçekleme olmayacağını kabul ve oluşturmaya çalışın Yazı tipi için görüntü boyutuyla eşleşecek en yakın nokta boyutunu seçecek bir çeşit tablo/algoritma.
+0

Cevabınız için teşekkürler, Paul tarafından önerilen yöntem çözdü. Yine de teşekkürler. – Shpongle

+0

İlk düşüncem, "çizgi boyunu metinle ölçeklemezseniz, o zaman _course_ lineer görünmeyecektir" şeklindeki ilk düşüncem oldu. Fakat çizgilerin uzunluğunu karşılaştırarak, 6pt yazı tipinin işlenen uzunluğunun 12pt'nin yarısından daha fazla olduğunu ve 5pt'nin 10pt'nin yarısından daha uzun olduğunu görebilirsiniz. – Ian

İlgili konular