| 123456789101112131415161718192021222324252627282930313233343536373839 |
- from __future__ import annotations
- from abc import ABC, abstractmethod
- from pathlib import Path
- import numpy as np
- from PIL import ImageGrab
- _REPOSITORY_ROOT_DIRECTORY = Path(__file__).resolve().parent.parent
- _OUTPUT_SCREENSHOT_FILE_PATH = _REPOSITORY_ROOT_DIRECTORY / "output" / "screenshot.png"
- FULL_SCREEN_SCREENSHOT_OUTPUT_PNG_FILE_PATH: Path = _OUTPUT_SCREENSHOT_FILE_PATH
- current_full_screen_screenshot_bgr_numpy: np.ndarray | None = None
- class FullScreenScreenshotCaptureSaver(ABC):
- @abstractmethod
- def capture_full_screen_and_store_in_memory(self) -> np.ndarray:
- ...
- class PillowImageGrabFullScreenScreenshotCaptureSaver(FullScreenScreenshotCaptureSaver):
- def capture_full_screen_and_store_in_memory(self) -> np.ndarray:
- global current_full_screen_screenshot_bgr_numpy
- full_screen_rgba_image = ImageGrab.grab()
- full_screen_rgb_image = full_screen_rgba_image.convert("RGB")
- _OUTPUT_SCREENSHOT_FILE_PATH.parent.mkdir(parents=True, exist_ok=True)
- full_screen_rgb_image.save(_OUTPUT_SCREENSHOT_FILE_PATH, format="PNG")
- rgb_uint8_numpy = np.asarray(full_screen_rgb_image, dtype=np.uint8)
- bgr_uint8_numpy = rgb_uint8_numpy[:, :, ::-1].copy()
- current_full_screen_screenshot_bgr_numpy = bgr_uint8_numpy
- return bgr_uint8_numpy
- def capture_full_screen_screenshot_bgr_numpy_and_save_screenshot_png() -> np.ndarray:
- """全屏截图:写入 ``output/screenshot.png``(覆盖),并返回 BGR ``numpy``(与内存缓存一致)。"""
- full_screen_screenshot_capture_saver = PillowImageGrabFullScreenScreenshotCaptureSaver()
- return full_screen_screenshot_capture_saver.capture_full_screen_and_store_in_memory()
|