• python --windows自定义截图(并返回位置信息)


    依赖:
    opencv-python4.0.0.21
    pyscreenshot
    3.1

    import cv2
    import pyscreenshot as ImageGrab
    import numpy as np
    import win32clipboard
    import win32con
    import win32gui
    import pygetwindow as gw
    
    def get_rectangle_coordinates():
        print("请按住鼠标左键并拖动以选择矩形区域,选中后按键盘上回车..")
        # 获取屏幕截图
        screenshot = ImageGrab.grab()
        # 将截图转换为OpenCV图像格式
        img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
        '''
        - `winname`:窗口的名称,用于显示图像和选择区域。可以是任意字符串。
        - `img`:要选择区域的图像。可以是一个NumPy数组或一个OpenCV的Mat对象。
        - `fromCenter`:一个布尔值,指定选择区域的方式。如果设置为`True`,则选择的区域以鼠标点击的位置为中心;如果设置为`False`
        ,则选择的区域以鼠标点击的位置为起点的矩形。默认值为`False`。
        - `showCrosshair`:一个布尔值,指定是否显示十字线以帮助选择区域。如果设置为`True`,则显示十字线;如果设置为`False`,则不显示十字线。默认值为`False`。
        
        使用`cv2.selectROI()`函数时,你可以根据需要调整这些参数的值。例如,如果你希望选择的区域以鼠标点击的位置为中心,并显示十
        字线,可以将`fromCenter`设置为`True``showCrosshair`设置为`True`。
        
        请注意,`cv2.selectROI()`函数会返回一个包含所选区域的矩形的元组,格式为`(x, y, w, h)`,其中`(x, y)`是矩形左上角的坐标,`w`是矩形的宽度,`h`是矩形的高度。你可以使用这些值来提取所选区域。
        '''
        
        # 创建窗口并显示截图
        cv2.namedWindow("image", cv2.WINDOW_NORMAL)
        '''
        - `cv2.WINDOW_NORMAL`:创建一个可调整大小的窗口。
        - `cv2.WINDOW_AUTOSIZE`:创建一个自适应大小的窗口,窗口的大小将根据图像的大小自动调整。
        - `cv2.WINDOW_FULLSCREEN`:创建一个全屏窗口。
        - `cv2.WINDOW_FREERATIO`:创建一个可调整大小的窗口,窗口的宽高比可以自由调整。
        - `cv2.WINDOW_KEEPRATIO`:创建一个可调整大小的窗口,窗口的宽高比将保持不变。
        '''
        cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
        cv2.imshow("image", img)
    
    	window = gw.getWindowsWithTitle('image')[0]  #窗口置顶
        hwnd = window._hWnd
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
    
        # 等待用户选择矩形区域
        rect = cv2.selectROI("image", img, fromCenter=False, showCrosshair=False)
        cv2.destroyAllWindows()
    
        x, y, w, h = rect
        # 提取所选区域
        roi = img[y:y + h, x:x + w]
        cv2.imwrite("selected_roi.jpg", roi)  # 保存文件,可以是临时路径
        return rect
    # 获取用户选择的矩形区域坐标
    x, y, width, height = get_rectangle_coordinates()
    print(f"您选择的矩形区域坐标是:({x}, {y}, {width}, {height})")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    示例

    import os
    import time
    import cv2
    import keyboard
    import pyscreenshot as ImageGrab
    import numpy as np
    import win32con
    import win32gui
    import pygetwindow as gw
    from loguru import logger
    
    def get_rectangle_coordinates():
        logger.success("提示:【请按住win+空格,截图后按回车】")
        screenshot = ImageGrab.grab()
        img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
        cv2.namedWindow("image", cv2.WINDOW_NORMAL)
        cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
        cv2.imshow("image", img)
        window = gw.getWindowsWithTitle('image')[0]
        hwnd = window._hWnd
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
    
        rect = cv2.selectROI("image", img, fromCenter=False, showCrosshair=False)
        cv2.destroyAllWindows()
        x, y, w, h = rect
        # 提取所选区域
        roi = img[y:y + h, x:x + w]
        cv2.imwrite("selected_roi.jpg", roi)  # 保存文件,可以是临时路径
        return rect
    
    
    def on_key(event):
        if event.name == 'space' and keyboard.is_pressed('win'):
            print('Win+空格键被按下')
            keyboard.unhook_all()  # 取消注册的按键事件回调函数
            # 获取用户选择的矩形区域坐标
            x, y, width, height = get_rectangle_coordinates()
            print(f"您选择的矩形区域坐标是:({x}, {y}, {width}, {height})")
            os._exit(0)
    
    keyboard.on_press(on_key)
    keyboard.wait()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    MidJourney | AI绘画也有艺术
    自定义字符串排序
    ESP8266发送WOL幻数据包实现电脑远程唤醒
    初谈软件工程(一)
    大家都能看得懂的源码 - 如何封装 cookie/localStorage/sessionStorage hook?
    从0到1搭建推荐系统
    nodejs+vue杰和牧场管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
    MPLS隧道——Hub&Spoke组网
    Spring Boot中的@Controller使用教程
    [Love] VSCODE 调试 LOVE 引擎游戏
  • 原文地址:https://blog.csdn.net/weixin_44634704/article/details/133155156