用Python實(shí)現(xiàn)屏幕截圖詳解
一、序言
在csdn上有很多純copy,這給我復(fù)現(xiàn)帶來(lái)了很大的麻煩,所以我想根據(jù)我的個(gè)人找截圖的經(jīng)歷記錄下來(lái),給未來(lái)的自己看,免得忘記了云云。
由于我比較喜歡用opencv處理圖像,所以截屏最后都會(huì)附帶一個(gè)使用opencv顯示圖片的一個(gè)步驟。
二、環(huán)境配置
1、下載pyautogui包
pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用pyautogui方法獲取截屏的話,只下載這個(gè)就行了
2、下載opencv-python包
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:方便實(shí)現(xiàn)對(duì)圖片的進(jìn)一步處理,比如實(shí)時(shí)獲取云云。
3、下載PyQt5包
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用PyQt方法截屏下載介個(gè)
4、下載pypiwin32包
pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple/
注:使用PyQt方法截屏下載介個(gè)
三、屏幕截屏源碼與解析
1、使用pyautogui方法實(shí)現(xiàn)截屏
import pyautogui
import cv2
import numpy as np
img = pyautogui.screenshot(region=[300,50, 200, 100]) # 分別代表:左上角坐標(biāo),寬高
#對(duì)獲取的圖片轉(zhuǎn)換成二維矩陣形式,后再將RGB轉(zhuǎn)成BGR
#因?yàn)閕mshow,默認(rèn)通道順序是BGR,而pyautogui默認(rèn)是RGB所以要轉(zhuǎn)換一下,不然會(huì)有點(diǎn)問(wèn)題
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
cv2.imshow("截屏",img)
cv2.waitKey(0)
優(yōu)點(diǎn):
方便快捷,容易寫核心部分就一行.速度快0.04s左右,基本可以達(dá)到實(shí)時(shí)截屏的效果。可以自由確定截屏區(qū)域
缺點(diǎn):
但是不能指定獲取程序的窗口,因此窗口也不能遮擋。 2、使用PyQt方法實(shí)現(xiàn)截屏 a.獲取窗口的句柄,也就是目標(biāo)窗口名title。
import win32gui
hwnd_title = dict() #創(chuàng)建字典保存窗口的句柄與名稱映射關(guān)系
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)
注:程序會(huì)打印所有窗口的hwnd和title,有了title就可以進(jìn)行截圖了。
b.使用PyQt5截屏核心程序
from PyQt5.QtWidgets import QApplication
import win32gui
import sys
#這個(gè)是截取全屏的
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換成上一個(gè)程序中打印的title,并且保證那個(gè)窗口沒(méi)有被你最小化即可
優(yōu)點(diǎn):
方便快捷,容易寫核心部分就一行.速度快0.04s左右,基本可以達(dá)到實(shí)時(shí)截屏的效果??梢宰杂纱_定要截屏的窗口
缺點(diǎn):
不可以自由確定截屏區(qū)域 c.使用PyQt5截屏用Mat格式顯示的核心程序
def convertQImageToMat(incomingImage):
''' Converts a QImage into an opencv MAT format '''
# Format_RGB32 = 4,存入格式為B,G,R,A 對(duì)應(yīng) 0,1,2,3
# RGB32圖像每個(gè)像素用32比特位表示,占4個(gè)字節(jié),
# R,G,B分量分別用8個(gè)bit表示,存儲(chǔ)順序?yàn)锽,G,R,最后8個(gè)字節(jié)保留
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轉(zhuǎn)換為RBG格式
cv2.imshow("asd",img) #imshow
cv2.waitKey(0)
四、結(jié)語(yǔ)
我再查詢了多個(gè)截屏的方法之后,發(fā)現(xiàn)就學(xué)會(huì)這兩種截屏方法即可,所以就沒(méi)有再放其他方法了
到此這篇關(guān)于用Python實(shí)現(xiàn)屏幕截圖詳解的文章就介紹到這了,更多相關(guān)Python屏幕截圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中字典dict常用操作方法實(shí)例總結(jié)
這篇文章主要介紹了python中字典dict常用操作方法,實(shí)例總結(jié)了Python針對(duì)字典操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
python中delattr刪除對(duì)象方法的代碼分析
在本篇文章里小編給大家分享了一篇關(guān)于python中delattr刪除對(duì)象方法的代碼分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12
Python利用 SVM 算法實(shí)現(xiàn)識(shí)別手寫數(shù)字
支持向量機(jī) (Support Vector Machine, SVM) 是一種監(jiān)督學(xué)習(xí)技術(shù),它通過(guò)根據(jù)指定的類對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行最佳分離,從而在高維空間中構(gòu)建一個(gè)或一組超平面。本文將介紹通過(guò)SVM算法實(shí)現(xiàn)手寫數(shù)字的識(shí)別,需要的可以了解一下2021-12-12
使用Python模塊進(jìn)行數(shù)據(jù)處理的詳細(xì)步驟
Python 提供了豐富的模塊和庫(kù),用于處理各種類型的數(shù)據(jù),本文介紹了一些常用的模塊和庫(kù),以及如何使用它們進(jìn)行數(shù)據(jù)處理的詳細(xì)步驟和代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-02-02
python爬蟲(chóng)實(shí)現(xiàn)中英翻譯詞典
這篇文章主要為大家詳細(xì)介紹了python爬蟲(chóng)實(shí)現(xiàn)中英翻譯詞典,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
簡(jiǎn)單談?wù)凱ython中的反轉(zhuǎn)字符串問(wèn)題
本文給大家總結(jié)了5種可以實(shí)現(xiàn)python中反轉(zhuǎn)字符串的方法,非常的實(shí)用,有需要的小伙伴可以參考下2016-10-10

