
实现区域截图功能
发布日期:2021-05-07 21:44:09
浏览次数:20
分类:精选文章
本文共 4575 字,大约阅读时间需要 15 分钟。
截图工具的选择与实现方法
截图是软件开发中常用的操作之一,通过不同工具实现截图可以满足不同的需求。本文将介绍几种常用的截图实现方法,并提供相应的代码示例。
一、使用腾讯软件安装目录中的PrScrn.dll
腾讯提供了一些截图相关的动态链接库文件(DLL),这些工具可以通过调用DLL文件来实现截图功能。在安装目录下找到PrScrn.dll文件,将其放置在需要使用的目录中,并将路径替换为具体路径。以下是使用该工具在Maya外部环境中的实现代码:
import osimport subprocessimport sysfrom PyQt4.QtGui import QApplicationapp = QApplication(sys.argv)clipboard = QApplication.clipboard()if os.name == 'nt': startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDEelse: startupinfo = Nonegrab = subprocess.Popen('rundll32.exe D:/PrScrn.dll PrScrn', startupinfo=startupinfo)grab.wait()dataImage = clipboard.pixmap()dataImage.save('D:/Grab1.jpg')
二、使用自定义PyQt4截图工具
如果希望避免使用第三方DLL文件,可以使用PyQt4开发自定义截图工具。这种方法具有高度的可定制性,适合需要特定截图功能的场景。以下是一个简单的截图工具实现代码:
import sysfrom PyQt4.QtGui import (QApplication, QLabel, QHBoxLayout, QRubberBand, QPixmap, QPainter, QCursor)from PyQt4.QtCore import (QtCore, Qt, QtEvent)class Rubb(QLabel): def __init__(self, name=None, parent=None): super(Rubb, self).__init__(parent) self.name = name self.createWidgets() self.fullScreenLabel.showFullScreen() self.setCursor(Qt.CrossCursor) self.fullScreenPixmap = None def createWidgets(self): self.fullScreenLabel = QLabel() self.fullScreenLabel.setAutoFillBackground(True) self.fullScreenLabel.setPixmap(self.fullScreenPixmap) self.fullScreenLabel.showFullScreen() self.rubberBand = QRubberBand(QRubberBand.Rectangle, self.fullScreenLabel) self.rubberBand.setPalette(QPalette(Qt.blue)) self.leftMousePress = False self.origin = None self.rect = None self.screenshot = None def eventFilter(self, obj, event): if obj != self.fullScreenLabel: return QLabel.eventFilter(self, obj, event) if event.type() == QtEvent.MouseButtonPress: if event.button() == Qt.RightButton: self.fullScreenLabel.close() if event.button() == Qt.LeftButton: self.leftMousePress = True self.origin = event.pos() self.rubberBand.setGeometry(QtCore.QRect(self.origin, QtCore.QSize())) self.rubberBand.show() return True if event.type() == QtEvent.MouseMove and self.leftMousePress: if self.rubberBand: self.rubberBand.setGeometry(QtCore.QRect(self.origin, event.pos()).normalized()) return True if event.type() == QtEvent.MouseButtonRelease: self.leftMousePress = False if self.rubberBand: self.rect = QtCore.QRect(self.origin, event.pos()) self.screenshot = self.fullScreenPixmap.copy( self.rect.x(), self.rect.y(), self.rect.width(), self.rect.height()) self.screenshot.save(self.name + '.png', 'png') self.fullScreenLabel.close() return True return Falseif __name__ == "__main__": app = QApplication(sys.argv) main = Rubb(r'C:\Users\Administrator\Desktop\mayaApi\screen') main.show() app.exec_()
三、使用OpenCV实现截图
OpenCV提供了强大的图像处理功能,可以通过调用其函数来实现截图。以下是一个简单的OpenCV截图代码示例:
import cv2import osimport sysglobal imgdef on_mouse(event, x, y, flags, param): global img, point1, point2 img2 = img.copy() if event == cv2.EVENT_LBUTTONDOWN: point1 = (x, y) cv2.circle(img2, point1, 10, (0, 255, 0), 5) cv2.imshow('image', img2) elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): cv2.rectangle(img2, point1, (x, y), (255, 0, 0), 5) cv2.imshow('image', img2) elif event == cv2.EVENT_LBUTTONUP: point2 = (x, y) cv2.rectangle(img2, point1, point2, (0, 0, 255), 5) cv2.imshow('image', img2) min_x = min(point1[0], point2[0]) min_y = min(point1[1], point2[1]) width = abs(point1[0] - point2[0]) height = abs(point1[1] - point2[1]) cut_img = img[min_y:min_y + height, min_x:min_x + width] name = 'myTu_' path = os.path.abspath(os.path.join(os.getcwd())) t = 0 for i in os.listdir(path): if "myTu" in i: t += 1 cv2.imwrite(name + str(t) + ".jpg", cut_img)def main(): global img img = cv2.imread('1.jpg') cv2.namedWindow('image') cv2.setMouseCallback('image', on_mouse) cv2.imshow('image', img) cv2.waitKey(0)if __name__ == '__main__': main()
以上是几种常用的截图实现方法,每种方法都有其特点和适用场景。选择哪种方法取决于具体的需求和场景。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月24日 21时44分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2019-03-05
计算输入的一句英文语句中单词数
2019-03-05
lvs+keepalive构建高可用集群
2019-03-05
6 个 Linux 运维典型问题
2019-03-05
取消vim打开文件全是黄色方法
2019-03-05
一个系统部署多个tomcat实例
2019-03-05
HP服务器设置iLO
2019-03-05
从头实现一个WPF条形图
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05
针对单个网站的渗透思路
2019-03-05
Typescript 学习笔记六:接口
2019-03-05
02、MySQL—数据库基本操作
2019-03-05
OpenJDK1.8.0 源码解析————HashMap的实现(一)
2019-03-05
MySQL-时区导致的时间前后端不一致
2019-03-05
2021-04-05阅读小笔记:局部性原理
2019-03-05
go语言简单介绍,增强了解
2019-03-05
python file文件操作--内置对象open
2019-03-05