網站首頁 編程語言 正文
一、序言
在csdn上有很多純copy,這給我復現帶來了很大的麻煩,所以我想根據我的個人找截圖的經歷記錄下來,給未來的自己看,免得忘記了云云。
由于我比較喜歡用opencv處理圖像,所以截屏最后都會附帶一個使用opencv顯示圖片的一個步驟。
二、環境配置
1、下載pyautogui包
pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用pyautogui方法獲取截屏的話,只下載這個就行了
2、下載opencv-python包
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:方便實現對圖片的進一步處理,比如實時獲取云云。
3、下載PyQt5包
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用PyQt方法截屏下載介個
4、下載pypiwin32包
pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用PyQt方法截屏下載介個
三、屏幕截屏源碼與解析
1、使用pyautogui方法實現截屏
import pyautogui import cv2 import numpy as np img = pyautogui.screenshot(region=[300,50, 200, 100]) # 分別代表:左上角坐標,寬高 #對獲取的圖片轉換成二維矩陣形式,后再將RGB轉成BGR #因為imshow,默認通道順序是BGR,而pyautogui默認是RGB所以要轉換一下,不然會有點問題 img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) cv2.imshow("截屏",img) cv2.waitKey(0)
優點:
方便快捷,容易寫核心部分就一行.速度快0.04s左右,基本可以達到實時截屏的效果。可以自由確定截屏區域
缺點:
但是不能指定獲取程序的窗口,因此窗口也不能遮擋。 2、使用PyQt方法實現截屏 a.獲取窗口的句柄,也就是目標窗口名title。
import win32gui hwnd_title = dict() #創建字典保存窗口的句柄與名稱映射關系 def get_all_hwnd(hwnd, mouse): if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd): hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)}) win32gui.EnumWindows(get_all_hwnd, 0) for h, t in hwnd_title.items(): if t!= "": print(h, t)
注:程序會打印所有窗口的hwnd和title,有了title就可以進行截圖了。
b.使用PyQt5截屏核心程序
from PyQt5.QtWidgets import QApplication import win32gui import sys #這個是截取全屏的 hwnd = win32gui.FindWindow(None, 'C:/Windows/system32/cmd.exe') app = QApplication(sys.argv) screen = QApplication.primaryScreen() img = screen.grabWindow(hwnd).toImage() img.save("screenshot.jpg")
注:如果想截取特定的窗口,只需要將C:/Windows/system32/cmd.exe換成上一個程序中打印的title,并且保證那個窗口沒有被你最小化即可
優點:
方便快捷,容易寫核心部分就一行.速度快0.04s左右,基本可以達到實時截屏的效果。可以自由確定要截屏的窗口
缺點:
不可以自由確定截屏區域 c.使用PyQt5截屏用Mat格式顯示的核心程序
def convertQImageToMat(incomingImage): ''' Converts a QImage into an opencv MAT format ''' # Format_RGB32 = 4,存入格式為B,G,R,A 對應 0,1,2,3 # RGB32圖像每個像素用32比特位表示,占4個字節, # R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最后8個字節保留 incomingImage = incomingImage.convertToFormat(4) width = incomingImage.width() height = incomingImage.height() ptr = incomingImage.bits() ptr.setsize(incomingImage.byteCount()) arr = np.array(ptr).reshape(height, width, 4) # Copies the data # arr為BGRA,4通道圖片 return arr from PyQt5.QtWidgets import QApplication import win32gui import sys import cv2 import numpy as np hwnd = win32gui.FindWindow(None, '劍士之魂中文版小游戲,在線玩,4399小游戲 - 360安全瀏覽器 13.1') app = QApplication(sys.argv) screen = QApplication.primaryScreen() img = screen.grabWindow(hwnd).toImage() img=convertQImageToMat(img)#將獲取的圖像從QImage轉換為RBG格式 cv2.imshow("asd",img) #imshow cv2.waitKey(0)
四、結語
我再查詢了多個截屏的方法之后,發現就學會這兩種截屏方法即可,所以就沒有再放其他方法了
原文鏈接:https://blog.csdn.net/qq_51116518/article/details/122579136
相關推薦
- 2022-04-09 Spring Boot 配置CROS Filter
- 2023-03-20 Linq利用Distinct去除重復項問題(可自己指定)_C#教程
- 2022-12-21 C#?wpf?無邊框窗口添加陰影效果的實現_C#教程
- 2022-03-14 YUV420SP to JPEG
- 2023-04-03 Golang?filepath包常用函數詳解_Golang
- 2022-02-24 C語言數據結構與算法之排序總結(一)_C 語言
- 2022-08-07 Android?文件存儲系統原理_Android
- 2022-09-29 shell函數內調用另一個函數(不帶返回值和帶返回值)_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支