Вопрос или проблема
Мне было интересно, как заставить Python обнаруживать изменения в части моего экрана и выполнять какое-либо действие, если произошло изменение. Мне не нужно обнаруживать конкретное изменение, мне нужно, чтобы он выявлял любое изменение пикселя.
Я смотрел в разных местах, но не могу найти ничего, что подошло бы под мои требования.
Чтобы заставить Python обнаруживать изменения в конкретной части вашего экрана и выполнять какое-либо действие, когда происходит изменение, вы можете использовать сторонние библиотеки, такие как Pillow
и mss
, чтобы захватывать экран и проверять, изменился ли какой-либо пиксель. Ниже приведен пример, который показывает, как обнаружить изменения пикселей в определенной области экрана.
Вы можете периодически делать снимки экрана конкретной части экрана и сравнивать их с предыдущими, чтобы выявлять изменения.
Необходимые библиотеки
Вам нужно установить следующие библиотеки:
Pillow
(для обработки изображений)mss
(для создания снимков экрана)
Вы можете установить их с помощью следующей команды:
pip install pillow mss
Пример кода
import mss
import numpy as np
from PIL import Image
import time
# Установите область экрана для захвата (например, область 100x100 в верхнем левом углу)
monitor = {"top": 0, "left": 0, "width": 100, "height": 100}
# Используйте mss для создания снимков экрана
with mss.mss() as sct:
# Захватите начальный снимок экрана
previous_screenshot = np.array(sct.grab(monitor))
while True:
# Захватите текущий снимок экрана
current_screenshot = np.array(sct.grab(monitor))
# Сравните текущий снимок экрана с предыдущим
if not np.array_equal(current_screenshot, previous_screenshot):
print("Обнаружено изменение в области экрана!")
# Здесь вы можете добавить другие действия, например, инициировать событие
# Обновите предыдущий снимок экрана текущим
previous_screenshot = current_screenshot
# Подождите 1 секунду перед следующим проверкой
time.sleep(1)
Объяснение:
- Используйте
mss
для захвата конкретной области экрана (например, область 100×100). - Используйте
numpy
для сравнения снимков экрана и проверки изменений пикселей. - Если произошло изменение, выполните желаемое действие.
Вы можете настроить размер области экрана и временной интервал в зависимости от ваших потребностей.
Этот ответ схож по концепции с ответом Хэнка, но требует меньше кода.
Вы можете использовать pyautogui для создания снимков экрана вашего экрана (для этого потребуется установить с помощью pip
или conda
).
Что делает код, так это берет и сохраняет начальный первый снимок экрана, а затем запускает цикл. Каждый раз цикл делает новый снимок, сравнивает два снимка, а затем устанавливает первый снимок в качестве второго. Таким образом, мы можем делать один снимок каждый раз вместо двух и сделать скрипт быстрее и менее ресурсоемким.
Затем мы можем использовать read()
, чтобы прочитать значения пикселей обоих изображений и проверить на различия. Поскольку мы используем один и тот же метод для их создания, в данном случае вам не нужно беспокоиться о качестве или сжатии.
import pyautogui
region_of_screen = (0, 0, 300, 300) # Вы можете изменить область экрана, которую хотите отслеживать, здесь
croppedscreen = pyautogui.screenshot(region=region_of_screen).save('./screen1.png') # Вы также можете использовать `pyautogui.screenshot()` без `region`, чтобы захватить весь экран
while True: # Цикл while для постоянной проверки
croppedscreen2 = pyautogui.screenshot(region=region_of_screen) # Сделайте второй снимок экрана
croppedscreen2.save('./screen2.png') # Сохраните второй снимок экрана
if open("screen1.png","rb").read() == open("screen2.png","rb").read(): # Сравните значения пикселей обоих изображений
print('Нет обнаруженных изменений')
else:
print('Обнаружены изменения!')
croppedscreen = croppedscreen2 # Поскольку мы обнаруживаем изменения между каждым снимком экрана, мы можем сэкономить ресурсы, используя второй снимок в качестве первого и делая новый снимок для сравнения с ним.
croppedscreen.save('screen1.png')
Ответ или решение
Чтобы обнаружить изменения на экране части экрана с помощью Python, вы можете воспользоваться сторонними библиотеками, такими как Pillow
и mss
. В этой статье я подробно расскажу, как реализовать эту задачу, и предоставлю примеры кода для выполнения этой операции.
Требуемые библиотеки
Для начала вам нужно установить следующие библиотеки:
- Pillow (для обработки изображений)
- mss (для захвата экранов)
Вы можете установить их с помощью следующей команды:
pip install pillow mss
Пример кода
Ниже представлен пример кода, который позволит вам проверять изменения в определенной области экрана.
import mss
import numpy as np
import time
# Установите область экрана, которую нужно захватить (например, 100x100 пикселей в верхнем левом углу)
monitor = {"top": 0, "left": 0, "width": 100, "height": 100}
# Используем mss для захвата экранов
with mss.mss() as sct:
# Захватываем начальный снимок экрана
previous_screenshot = np.array(sct.grab(monitor))
while True:
# Захватываем текущий снимок экрана
current_screenshot = np.array(sct.grab(monitor))
# Сравниваем текущий и предыдущий снимок экрана
if not np.array_equal(current_screenshot, previous_screenshot):
print("Обнаружено изменение в области экрана!")
# Здесь вы можете добавить другие действия, например вызов события
# Обновляем предыдущий снимок экрана
previous_screenshot = current_screenshot
# Ожидание 1 секунды перед следующим проверкой
time.sleep(1)
Объяснение:
- Захват области экрана: Используйте
mss
для того, чтобы захватить определённую часть экрана (например, область 100×100 пикселей). - Сравнение изображений: Используйте
numpy
для сравнения снимков экрана и выявления изменений. - Действия при обнаружении изменений: Если обнаруживаются изменения, выполняйте нужные действия (например, вывод сообщения на экран).
Вы также можете изменить размер области экрана и интервал времени в зависимости от ваших потребностей.
Альтернативный подход с использованием pyautogui
Вы также можете использовать библиотеку pyautogui
для захвата экранов и проверки изменений. Вот пример для этого подхода:
import pyautogui
import time
region_of_screen = (0, 0, 300, 300) # Укажите область экрана для мониторинга
# Сохраните первый снимок экрана
pyautogui.screenshot(region=region_of_screen).save('./screen1.png')
while True: # Бесконечный цикл для постоянной проверки
# Захват второго снимка экрана
pyautogui.screenshot(region=region_of_screen).save('./screen2.png')
# Сравните значения пикселей обоих изображений
if open("screen1.png", "rb").read() == open("screen2.png", "rb").read():
print('Изменений не обнаружено')
else:
print('Обнаружены изменения!')
# Обновляем первый снимок экрана
open("screen2.png", "rb").read()
pyautogui.screenshot(region=region_of_screen).save('screen1.png')
# Небольшая задержка перед следующей проверкой
time.sleep(1)
Заключение
Следуя данным инструкциям, вы сможете создать программу на Python, которая будет обнаруживать изменения на экране в определенной области. Возможность настройки области захвата и интервалов секунда делает этот подход гибким и адаптируемым под ваши нужды. Не забудьте протестировать вашу программу на различных участках экрана и при различных условиях, чтобы удостовериться в ее надежности.