| from pathlib import Path |
|
|
| from PIL import Image, ImageDraw |
|
|
| from .corners import Circle, Corners |
|
|
| DEFAULT_COLOR = (0, 255, 255, 255) |
|
|
|
|
| def draw_circle(draw: ImageDraw.Draw, circle: Circle, color: tuple, width: int = 3): |
| x1 = circle.x - circle.r |
| y1 = circle.y - circle.r |
| x2 = circle.x + circle.r |
| y2 = circle.y + circle.r |
| draw.ellipse([x1, y1, x2, y2], outline=color, width=width) |
|
|
|
|
| def draw_circles( |
| image: Image.Image, |
| corners: Corners, |
| color: tuple = DEFAULT_COLOR, |
| width: int = 3, |
| ) -> Image.Image: |
| image = image.convert("RGBA") |
| overlay = Image.new("RGBA", image.size, (0, 0, 0, 0)) |
| draw = ImageDraw.Draw(overlay) |
|
|
| for corner in [corners.top_left, corners.top_right, corners.bottom_left, corners.bottom_right]: |
| draw_circle(draw, corner, color, width) |
|
|
| result = Image.alpha_composite(image, overlay) |
| return result.convert("RGB") |
|
|
|
|
| def draw_crop_lines( |
| image: Image.Image, |
| corners: Corners, |
| color: tuple = DEFAULT_COLOR, |
| width: int = 2, |
| ) -> Image.Image: |
| image = image.convert("RGBA") |
| overlay = Image.new("RGBA", image.size, (0, 0, 0, 0)) |
| draw = ImageDraw.Draw(overlay) |
|
|
| x_left, y_top, x_right, y_bottom = corners.get_crop_bounds() |
| img_w, img_h = image.size |
|
|
| draw.line([(x_left, 0), (x_left, img_h)], fill=color, width=width) |
| draw.line([(x_right, 0), (x_right, img_h)], fill=color, width=width) |
| draw.line([(0, y_top), (img_w, y_top)], fill=color, width=width) |
| draw.line([(0, y_bottom), (img_w, y_bottom)], fill=color, width=width) |
|
|
| result = Image.alpha_composite(image, overlay) |
| return result.convert("RGB") |
|
|
|
|
| def visualize_corners( |
| image: Image.Image, |
| corners: Corners, |
| output_path: Path | None = None, |
| color: tuple = DEFAULT_COLOR, |
| ) -> Image.Image: |
| image = image.convert("RGBA") |
| overlay = Image.new("RGBA", image.size, (0, 0, 0, 0)) |
| draw = ImageDraw.Draw(overlay) |
|
|
| for corner in [corners.top_left, corners.top_right, corners.bottom_left, corners.bottom_right]: |
| draw_circle(draw, corner, color, width=3) |
|
|
| x_left, y_top, x_right, y_bottom = corners.get_crop_bounds() |
| img_w, img_h = image.size |
|
|
| draw.line([(x_left, 0), (x_left, img_h)], fill=color, width=2) |
| draw.line([(x_right, 0), (x_right, img_h)], fill=color, width=2) |
| draw.line([(0, y_top), (img_w, y_top)], fill=color, width=2) |
| draw.line([(0, y_bottom), (img_w, y_bottom)], fill=color, width=2) |
|
|
| result = Image.alpha_composite(image, overlay) |
| result = result.convert("RGB") |
|
|
| if output_path: |
| result.save(output_path) |
|
|
| return result |
|
|