17

Próbuję dynamicznie skalować tekst do umieszczenia na obrazach o różnych lecz znanych wymiarach. Tekst zostanie zastosowany jako znak wodny. Czy istnieje jakiś sposób skalowania tekstu w odniesieniu do wymiarów obrazu? Nie wymagam, aby tekst zajmował całą powierzchnię, aby był on wystarczająco widoczny, aby można go było łatwo zidentyfikować i które trudno było usunąć. Używam Python Imaging Library w wersji 1.1.7. w systemie Linux.PIL jak skalować rozmiar tekstu w stosunku do rozmiaru obrazu

Chciałbym móc ustawić stosunek rozmiaru tekstu do wymiarów obrazu, np. 1/10 rozmiaru lub czegoś.

Szukałem atrybutu rozmiaru czcionki, aby zmienić rozmiar, ale nie miałem szczęścia w tworzeniu algorytmu do skalowania. Zastanawiam się, czy istnieje lepszy sposób.

Jakieś pomysły, w jaki sposób mogę to osiągnąć?

Dzięki

Odpowiedz

37

Możesz zwiększyć rozmiar czcionki, aż znajdziesz odpowiedni krój. font.getsize() to funkcja informująca o tym, jak duży jest renderowany tekst.

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 

Jeśli to nie jest wystarczająco skuteczne dla Ciebie, można zaimplementować system korzeniowy rozpoznawczych, ale zgaduję, że funkcja font.getsize() jest małe ziemniaki w porównaniu do reszty procesów edycji obrazu.

+4

Cześć Paul, to załatwiło sprawę. Dzięki za pomoc – Shpongle

5

Generalnie po zmianie czcionki zaklejania jej nie będzie liniowa zmiana rozmiaru czcionki.

Non-linear Scaling

Teraz to często zależy od oprogramowania, czcionki, itp ... Ten przykład został wzięty z Typophile i wykorzystuje lateks + komputer Nowoczesne czcionki. Jak widać nie jest to dokładnie liniowe skalowanie. Więc jeśli masz problem z nieliniowym skalowaniem czcionek, nie jestem pewien, jak to rozwiązać, ale jedną z sugestii może być.

  1. Render czcionkę zbliżony do rozmiaru, który chcesz, a następnie przeskalować że w górę/w dół poprzez regularne algorytmu skalowania obrazu ...
  2. Wystarczy przyjąć, że nie będzie dokładnie być liniowe skalowanie i spróbować stworzyć jakiś rodzaj tabeli/algorytmu, który wybierze najbliższy rozmiar czcionki, aby dopasować ją do rozmiaru obrazu.
+0

Dzięki za odpowiedź, Metoda zaproponowana przez Pawła rozwiązała go. Mimo to dzięki. – Shpongle

+0

Moja pierwsza myśl, patrząc na obraz, brzmiała "dobrze, jeśli nie przeskalujesz wysokości linii wraz z tekstem, a potem z __________, to nie będzie wyglądać liniowo". Porównując długość linii, można zauważyć, że długość renderowanej czcionki 6pt wynosi więcej niż połowę 12 punktów, a 5 punktów jest dłuższa niż połowa długości 10 punktów. – Ian