Source code for webtraversallibrary.graphics
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""
Module containing helper functions for graphics-related operations on webdrivers and snapshots.
"""
import importlib.resources
import logging
from PIL import Image, ImageDraw, ImageFont
from .color import Color
from .geometry import Point, Rectangle
logger = logging.getLogger("wtl")
[docs]def crop_image(image: Image.Image, rect: Rectangle) -> Image.Image:
"""
Crops the part of the image specified by its ``rect``.
Rectangle specified by ``rect`` must lie inside of the image bounds.
"""
if rect.area == 0:
raise ValueError(f"Rectangle {rect} is degenerate")
# Rectangle we crop out must be somewhere within the image
image_rect = Rectangle(Point(0, 0), Point(image.width, image.height))
if rect not in image_rect:
raise ValueError(f"Bounds {rect} outside of image area {image_rect}")
return image.crop(rect.bounds)
[docs]def draw_rect(image: Image.Image, rect: Rectangle, color: Color, width: int):
"""
Draws a bounding box around the specified rectangle on the image.
"""
draw = ImageDraw.Draw(image, mode="RGBA")
draw.rectangle(rect.bounds, outline=color.to_tuple(with_alpha=True), width=width)
[docs]def draw_text(image: Image.Image, top_left: Point, color: Color, size: int, text: str):
"""
Draws text on a PIL image.
"""
padding = 2
image_width, image_height = image.size
with importlib.resources.path("webtraversallibrary.font", "OpenSans-Regular.ttf") as filepath:
font = ImageFont.truetype(str(filepath), size)
# Make sure text does not exceed image boundaries
text_width, text_height = font.getsize(text)
draw_text_x = min(top_left.x, image_width - text_width - padding)
draw_text_y = min(top_left.y, image_height - text_height - padding)
draw = ImageDraw.Draw(image, mode="RGB")
draw.text(xy=(draw_text_x, draw_text_y), text=text, fill=color.to_tuple(), font=font)