Merge pull request #7806 from radarhere/imagefont

This commit is contained in:
Hugo van Kemenade 2024-03-11 17:43:40 +02:00 committed by GitHub
commit 350d7f2b01
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 72 additions and 8 deletions

View File

@ -232,10 +232,10 @@ Previous code::
im = Image.new("RGB", (100, 100)) im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
width, height = draw.textsize("Hello world") width, height = draw.textsize("Hello world", font)
width, height = font.getsize_multiline("Hello\nworld") width, height = font.getsize_multiline("Hello\nworld")
width, height = draw.multiline_textsize("Hello\nworld") width, height = draw.multiline_textsize("Hello\nworld", font)
Use instead:: Use instead::
@ -247,11 +247,43 @@ Use instead::
im = Image.new("RGB", (100, 100)) im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
width = draw.textlength("Hello world") width = draw.textlength("Hello world", font)
left, top, right, bottom = draw.multiline_textbbox((0, 0), "Hello\nworld") left, top, right, bottom = draw.multiline_textbbox((0, 0), "Hello\nworld", font)
width, height = right - left, bottom - top width, height = right - left, bottom - top
Previously, the ``size`` methods returned a ``height`` that included the vertical
offset of the text, while the new ``bbox`` methods distinguish this as a ``top``
offset.
.. image:: ./example/size_vs_bbox.png
:alt: In bbox methods, top measures the vertical distance above the text, while bottom measures that plus the vertical distance of the text itself. In size methods, height also measures the vertical distance above the text plus the vertical distance of the text itself.
:align: center
If you are using these methods for aligning text, consider using :ref:`text-anchors` instead
which avoid issues that can occur with non-English text or unusual fonts.
For example, instead of the following code::
from PIL import Image, ImageDraw, ImageFont
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")
im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im)
width, height = draw.textsize("Hello world", font)
x, y = (100 - width) / 2, (100 - height) / 2
draw.text((x, y), "Hello world", font=font)
Use instead::
from PIL import Image, ImageDraw, ImageFont
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")
im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im)
draw.text((100 / 2, 100 / 2), "Hello world", font=font, anchor="mm")
FreeTypeFont.getmask2 fill parameter FreeTypeFont.getmask2 fill parameter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -69,10 +69,10 @@ Previous code::
im = Image.new("RGB", (100, 100)) im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
width, height = draw.textsize("Hello world") width, height = draw.textsize("Hello world", font)
width, height = font.getsize_multiline("Hello\nworld") width, height = font.getsize_multiline("Hello\nworld")
width, height = draw.multiline_textsize("Hello\nworld") width, height = draw.multiline_textsize("Hello\nworld", font)
Use instead:: Use instead::
@ -84,11 +84,43 @@ Use instead::
im = Image.new("RGB", (100, 100)) im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
width = draw.textlength("Hello world") width = draw.textlength("Hello world", font)
left, top, right, bottom = draw.multiline_textbbox((0, 0), "Hello\nworld") left, top, right, bottom = draw.multiline_textbbox((0, 0), "Hello\nworld", font)
width, height = right - left, bottom - top width, height = right - left, bottom - top
Previously, the ``size`` methods returned a ``height`` that included the vertical
offset of the text, while the new ``bbox`` methods distinguish this as a ``top``
offset.
.. image:: ../example/size_vs_bbox.png
:alt: In bbox methods, top measures the vertical distance above the text, while bottom measures that plus the vertical distance of the text itself. In size methods, height also measures the vertical distance above the text plus the vertical distance of the text itself.
:align: center
If you are using these methods for aligning text, consider using :ref:`text-anchors` instead
which avoid issues that can occur with non-English text or unusual fonts.
For example, instead of the following code::
from PIL import Image, ImageDraw, ImageFont
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")
im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im)
width, height = draw.textsize("Hello world", font)
x, y = (100 - width) / 2, (100 - height) / 2
draw.text((x, y), "Hello world", font=font)
Use instead::
from PIL import Image, ImageDraw, ImageFont
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")
im = Image.new("RGB", (100, 100))
draw = ImageDraw.Draw(im)
draw.text((100 / 2, 100 / 2), "Hello world", font=font, anchor="mm")
API Additions API Additions
============= =============