mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-24 16:24:11 +03:00
Added font_size keyword arguments to ImageDraw text methods
This commit is contained in:
parent
eccef36948
commit
b1f5ee9043
BIN
Tests/images/imagedraw_default_font_size.png
Normal file
BIN
Tests/images/imagedraw_default_font_size.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
|
@ -1,8 +1,9 @@
|
||||||
|
import contextlib
|
||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from PIL import Image, ImageColor, ImageDraw, ImageFont
|
from PIL import Image, ImageColor, ImageDraw, ImageFont, features
|
||||||
|
|
||||||
from .helper import (
|
from .helper import (
|
||||||
assert_image_equal,
|
assert_image_equal,
|
||||||
|
@ -1344,6 +1345,32 @@ def test_setting_default_font():
|
||||||
assert isinstance(draw.getfont(), ImageFont.load_default().__class__)
|
assert isinstance(draw.getfont(), ImageFont.load_default().__class__)
|
||||||
|
|
||||||
|
|
||||||
|
def test_default_font_size():
|
||||||
|
freetype_support = features.check_module("freetype2")
|
||||||
|
text = "Default font at a specific size."
|
||||||
|
|
||||||
|
im = Image.new("RGB", (220, 25))
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
with contextlib.nullcontext() if freetype_support else pytest.raises(ImportError):
|
||||||
|
draw.text((0, 0), text, font_size=16)
|
||||||
|
assert_image_equal_tofile(im, "Tests/images/imagedraw_default_font_size.png")
|
||||||
|
|
||||||
|
with contextlib.nullcontext() if freetype_support else pytest.raises(ImportError):
|
||||||
|
assert draw.textlength(text, font_size=16) == 216
|
||||||
|
|
||||||
|
with contextlib.nullcontext() if freetype_support else pytest.raises(ImportError):
|
||||||
|
assert draw.textbbox((0, 0), text, font_size=16) == (0, 3, 216, 19)
|
||||||
|
|
||||||
|
im = Image.new("RGB", (220, 25))
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
with contextlib.nullcontext() if freetype_support else pytest.raises(ImportError):
|
||||||
|
draw.multiline_text((0, 0), text, font_size=16)
|
||||||
|
assert_image_equal_tofile(im, "Tests/images/imagedraw_default_font_size.png")
|
||||||
|
|
||||||
|
with contextlib.nullcontext() if freetype_support else pytest.raises(ImportError):
|
||||||
|
assert draw.multiline_textbbox((0, 0), text, font_size=16) == (0, 3, 216, 19)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("bbox", BBOX)
|
@pytest.mark.parametrize("bbox", BBOX)
|
||||||
def test_same_color_outline(bbox):
|
def test_same_color_outline(bbox):
|
||||||
# Prepare shape
|
# Prepare shape
|
||||||
|
|
|
@ -113,6 +113,15 @@ class ImageDraw:
|
||||||
self.font = ImageFont.load_default()
|
self.font = ImageFont.load_default()
|
||||||
return self.font
|
return self.font
|
||||||
|
|
||||||
|
def _getfont(self, font_size):
|
||||||
|
if font_size is not None:
|
||||||
|
from . import ImageFont
|
||||||
|
|
||||||
|
font = ImageFont.load_default(font_size)
|
||||||
|
else:
|
||||||
|
font = self.getfont()
|
||||||
|
return font
|
||||||
|
|
||||||
def _getink(self, ink, fill=None):
|
def _getink(self, ink, fill=None):
|
||||||
if ink is None and fill is None:
|
if ink is None and fill is None:
|
||||||
if self.fill:
|
if self.fill:
|
||||||
|
@ -456,6 +465,13 @@ class ImageDraw:
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
"""Draw text."""
|
"""Draw text."""
|
||||||
|
if embedded_color and self.mode not in ("RGB", "RGBA"):
|
||||||
|
msg = "Embedded color supported only in RGB and RGBA modes"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
if font is None:
|
||||||
|
font = self._getfont(kwargs.get("font_size"))
|
||||||
|
|
||||||
if self._multiline_check(text):
|
if self._multiline_check(text):
|
||||||
return self.multiline_text(
|
return self.multiline_text(
|
||||||
xy,
|
xy,
|
||||||
|
@ -473,13 +489,6 @@ class ImageDraw:
|
||||||
embedded_color,
|
embedded_color,
|
||||||
)
|
)
|
||||||
|
|
||||||
if embedded_color and self.mode not in ("RGB", "RGBA"):
|
|
||||||
msg = "Embedded color supported only in RGB and RGBA modes"
|
|
||||||
raise ValueError(msg)
|
|
||||||
|
|
||||||
if font is None:
|
|
||||||
font = self.getfont()
|
|
||||||
|
|
||||||
def getink(fill):
|
def getink(fill):
|
||||||
ink, fill = self._getink(fill)
|
ink, fill = self._getink(fill)
|
||||||
if ink is None:
|
if ink is None:
|
||||||
|
@ -570,6 +579,8 @@ class ImageDraw:
|
||||||
stroke_width=0,
|
stroke_width=0,
|
||||||
stroke_fill=None,
|
stroke_fill=None,
|
||||||
embedded_color=False,
|
embedded_color=False,
|
||||||
|
*,
|
||||||
|
font_size=None,
|
||||||
):
|
):
|
||||||
if direction == "ttb":
|
if direction == "ttb":
|
||||||
msg = "ttb direction is unsupported for multiline text"
|
msg = "ttb direction is unsupported for multiline text"
|
||||||
|
@ -584,6 +595,9 @@ class ImageDraw:
|
||||||
msg = "anchor not supported for multiline text"
|
msg = "anchor not supported for multiline text"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
if font is None:
|
||||||
|
font = self._getfont(font_size)
|
||||||
|
|
||||||
widths = []
|
widths = []
|
||||||
max_width = 0
|
max_width = 0
|
||||||
lines = self._multiline_split(text)
|
lines = self._multiline_split(text)
|
||||||
|
@ -645,6 +659,8 @@ class ImageDraw:
|
||||||
features=None,
|
features=None,
|
||||||
language=None,
|
language=None,
|
||||||
embedded_color=False,
|
embedded_color=False,
|
||||||
|
*,
|
||||||
|
font_size=None,
|
||||||
):
|
):
|
||||||
"""Get the length of a given string, in pixels with 1/64 precision."""
|
"""Get the length of a given string, in pixels with 1/64 precision."""
|
||||||
if self._multiline_check(text):
|
if self._multiline_check(text):
|
||||||
|
@ -655,7 +671,7 @@ class ImageDraw:
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
if font is None:
|
if font is None:
|
||||||
font = self.getfont()
|
font = self._getfont(font_size)
|
||||||
mode = "RGBA" if embedded_color else self.fontmode
|
mode = "RGBA" if embedded_color else self.fontmode
|
||||||
return font.getlength(text, mode, direction, features, language)
|
return font.getlength(text, mode, direction, features, language)
|
||||||
|
|
||||||
|
@ -672,12 +688,17 @@ class ImageDraw:
|
||||||
language=None,
|
language=None,
|
||||||
stroke_width=0,
|
stroke_width=0,
|
||||||
embedded_color=False,
|
embedded_color=False,
|
||||||
|
*,
|
||||||
|
font_size=None,
|
||||||
):
|
):
|
||||||
"""Get the bounding box of a given string, in pixels."""
|
"""Get the bounding box of a given string, in pixels."""
|
||||||
if embedded_color and self.mode not in ("RGB", "RGBA"):
|
if embedded_color and self.mode not in ("RGB", "RGBA"):
|
||||||
msg = "Embedded color supported only in RGB and RGBA modes"
|
msg = "Embedded color supported only in RGB and RGBA modes"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
if font is None:
|
||||||
|
font = self._getfont(font_size)
|
||||||
|
|
||||||
if self._multiline_check(text):
|
if self._multiline_check(text):
|
||||||
return self.multiline_textbbox(
|
return self.multiline_textbbox(
|
||||||
xy,
|
xy,
|
||||||
|
@ -693,8 +714,6 @@ class ImageDraw:
|
||||||
embedded_color,
|
embedded_color,
|
||||||
)
|
)
|
||||||
|
|
||||||
if font is None:
|
|
||||||
font = self.getfont()
|
|
||||||
mode = "RGBA" if embedded_color else self.fontmode
|
mode = "RGBA" if embedded_color else self.fontmode
|
||||||
bbox = font.getbbox(
|
bbox = font.getbbox(
|
||||||
text, mode, direction, features, language, stroke_width, anchor
|
text, mode, direction, features, language, stroke_width, anchor
|
||||||
|
@ -714,6 +733,8 @@ class ImageDraw:
|
||||||
language=None,
|
language=None,
|
||||||
stroke_width=0,
|
stroke_width=0,
|
||||||
embedded_color=False,
|
embedded_color=False,
|
||||||
|
*,
|
||||||
|
font_size=None,
|
||||||
):
|
):
|
||||||
if direction == "ttb":
|
if direction == "ttb":
|
||||||
msg = "ttb direction is unsupported for multiline text"
|
msg = "ttb direction is unsupported for multiline text"
|
||||||
|
@ -728,6 +749,9 @@ class ImageDraw:
|
||||||
msg = "anchor not supported for multiline text"
|
msg = "anchor not supported for multiline text"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
if font is None:
|
||||||
|
font = self._getfont(font_size)
|
||||||
|
|
||||||
widths = []
|
widths = []
|
||||||
max_width = 0
|
max_width = 0
|
||||||
lines = self._multiline_split(text)
|
lines = self._multiline_split(text)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user