mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 17:36:18 +03:00
added support for multiline text drawing
This commit is contained in:
parent
a09da242fd
commit
d626679c23
|
@ -257,6 +257,9 @@ class ImageDraw(object):
|
|||
# Draw text.
|
||||
|
||||
def text(self, xy, text, fill=None, font=None, anchor=None):
|
||||
if "\n" in text:
|
||||
return self.multiline_text(xy, text, fill, font, anchor)
|
||||
|
||||
ink, fill = self._getink(fill)
|
||||
if font is None:
|
||||
font = self.getfont()
|
||||
|
@ -273,10 +276,49 @@ class ImageDraw(object):
|
|||
mask = font.getmask(text)
|
||||
self.draw.draw_bitmap(xy, mask, ink)
|
||||
|
||||
def multiline_text(self, xy, text, fill=None, font=None, anchor=None,
|
||||
spacing=0, align="left"):
|
||||
widths, heights = [], []
|
||||
max_width = 0
|
||||
lines = text.split("\n")
|
||||
for line in lines:
|
||||
line_width, line_height = self.textsize(line, font)
|
||||
widths.append(line_width)
|
||||
max_width = max(max_width, line_width)
|
||||
heights.append(line_height)
|
||||
left, top = xy
|
||||
for idx, line in enumerate(lines):
|
||||
if align == "left":
|
||||
pass # left = x
|
||||
elif align == "center":
|
||||
left += (max_width - widths[idx]) / 2.0
|
||||
elif align == "right":
|
||||
left += (max_width - widths[idx])
|
||||
else:
|
||||
assert False, 'align must be either "left", "center" or "right"'
|
||||
self.text((left, top),
|
||||
line, fill, font, anchor)
|
||||
top += heights[idx] + spacing
|
||||
left = xy[0]
|
||||
|
||||
def multiline_textsize(self, text, font=None, spacing=0):
|
||||
max_width = 0
|
||||
height = 0
|
||||
lines = text.split("\n")
|
||||
for line in lines:
|
||||
line_width, line_height = self.textsize(line, font)
|
||||
height += line_height + spacing
|
||||
max_width = max(max_width, line_width)
|
||||
return max_width, height
|
||||
|
||||
|
||||
##
|
||||
# Get the size of a given string, in pixels.
|
||||
|
||||
def textsize(self, text, font=None):
|
||||
if "\n" in text:
|
||||
return multiline_textsize(text, font)
|
||||
|
||||
if font is None:
|
||||
font = self.getfont()
|
||||
return font.getsize(text)
|
||||
|
|
Loading…
Reference in New Issue
Block a user