2017-08-25 32 views
16

Próbuję dynamicznie zwiększać rozmiar obrazu w odniesieniu do czcionki i tekstu podanego do draw.text().PIL jak skalować obraz w stosunku do tekstu narysowanego na obrazku

Orignal Problem polega na utworzeniu obrazu podpisu na podstawie nazwy i czcionki wybranej przez użytkownika.

Oto mój kod

from PIL import (Image, ImageDraw, ImageFont,) 

width=20 
height=20 
selected_font='simply_glomrous.ttf' 
font_size=30 

img = Image.new('RGBA', (width, height), (255, 255, 255, 0)) 
draw = ImageDraw.Draw(img) 
font = ImageFont.truetype(selected_font, font_size) 
draw.text((0,0), "Adil Malik", (0,0,0), font) 
img.save('signature.png') 

ale jestem nadal ma ten sam rozmiar obrazu zdefiniowanego w szerokości i wysokości. Czy możemy dokonać dynamicznej zmiany rozmiaru obrazu w oparciu o czcionkę i jej rozmiar?

Uwaga: To pytanie jest przeciwieństwem this stackoverflow question

Odpowiedz

10

Niestety, nikt nie jest w stanie odpowiedzieć na moje pytanie.

Zasadniczo nie można ustawić stałej szerokości i wysokości podczas ustawiania rozmiaru czcionki. Obie są zależne od siebie nawzajem. Więc jeśli jeden wzrost, drugi również wzrasta.

Więc wymyśliłem inne rozwiązanie. Właśnie ustawiam rozmiar czcionki, a następnie na podstawie tego rozmiaru czcionki, ustawiam szerokość i wysokość.

from PIL import (Image, ImageDraw, ImageFont,) 

name = 'Adil Malik' 
selected_font='simply_glomrous.ttf' 
font_size=30 

font = ImageFont.truetype(selected_font, font_size) 
font_size = font.getsize(name) 

img = Image.new('RGBA', (font_size[0], font_size[0]), (255, 255, 255, 0)) 
draw = ImageDraw.Draw(img) 
font = ImageFont.truetype(selected_font, font_size) 
draw.text((0,0), name, (0,0,0), font) 
img.save('signature.png') 
1

Po pierwsze, trzeba uzyskać prawo waga: Zaczynasz z danego rozmiaru czcionki w punktach, które zdefiniowane jako 1/72 cala; to są łuski "prawdziwego świata". Obraz, na który rysujesz, jest zdefiniowany w pikselach. Piksele mają stosunek do cali/punktów, tylko jeśli zdefiniujesz współczynnik pikseli na cal.

Sposób, w jaki myślisz o problemie, jest trochę wstecz: musisz zacząć od pikseli, które posiadasz (od źródła lub obrazu docelowego), a następnie obliczyć odpowiedni rozmiar czcionki. Jeśli chcesz, aby użytkownik wybrał rozmiar czcionki, musisz zdefiniować (lub poprosić o) docelową wartość DPI, aby zmienić jednostkę wagi.

+0

Ale znowu mój problem nadal istnieje. Nie mam pojęcia, jaka byłaby długość tekstu. Nie mogę zacząć od stałego rozmiaru obrazu. –

2

Funkcja, której szukasz, to metoda Draw.textsize, która pobiera ciąg tekstowy i opcje rysowania jako dane wejściowe i zwraca szerokość i wysokość renderowanego tekstu.

http://effbot.org/imagingbook/imagedraw.htm#tag-ImageDraw.Draw.textsize

Można użyć klasy Draw z obrazem, który ma szerokość i wysokość zero, a następnie wywołać metodę w celu ustalenia wymiarów tekstu szukasz render. Po poznaniu tych wymiarów można odpowiednio zmienić rozmiar obrazu. Na przykład:

from PIL import ImageDraw, ImageFont, Image 

# parameters 
text = "My Name" 
selected_font = "simply_glomrous.ttf" 
font_size = 30 

# get the size of the text 
img = Image.new('RGBA', (0,0), (255, 255, 255, 0)) 
font = ImageFont.truetype(selected_font, font_size) 
draw = ImageDraw.Draw(img) 
text_size = draw.textsize(text, font) 

# resize and draw 
img = img.resize(text_size) 
draw.text((0,0), text, (0,0,0), font) 
img.save('signature.png') 
3

Jeśli można użyć OpenCV i numpy można

  1. Sprawdź rozmiar tekstu przy użyciu getTextSize
  2. Tworzenie biały obraz przy użyciu numpy.ones ((wysokość, szerokość, 3), np.uint8) * 255

  3. Dodawanie tekstu do obrazu przy użyciu putText,

  4. Zapisz obraz używając imwrite.

Aby uzyskać referencje, zobacz here i here.