我使用以下代码拍摄网页的屏幕截图。 从我理解的代码开始,首先将完整的页面加载到框架中,然后在画家中渲染框架。我面临的问题是,某些网页在内容方面可能非常冗长,但我只想要网页第一页的屏幕截图。有什么方法可以解决这个问题吗?
def capture(self, url, output_file):
self.load(QUrl(url))
self.wait_load()
# set to webpage size
frame = self.page().mainFrame()
self.page().setViewportSize(frame.contentsSize())
# render image
image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
painter = QPainter(image)
frame.render(painter)
painter.end()
print 'saving', output_file
image.save(output_file)
我试图在QSize对象的帮助下设置框架的首选大小,但它也没有帮助。 或者替代方案,有什么方法可以裁剪图像吗? 非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
您可以将图片大小调整为屏幕大小
import gtk, pygtk def capture(self, url, output_file): self.load(QUrl(url)) self.wait_load() # set to webpage size frame = self.page().mainFrame() self.page().setViewportSize(frame.contentsSize()) # render image image = QImage(self.page().viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) frame.render(painter) painter.end() window = gtk.Window() s = window.get_screen() image = image.resize((s.get_width(),s.get_height()), Image.ANTIALIAS) print 'saving', output_file image.save(output_file)
答案 1 :(得分:1)
没有“第一页”这样的东西。这完全取决于应用程序决定如何分割内容。
目前,您的脚本显式将第一个分区设置为页面的全部内容。为避免这种情况,您只需确定要捕获的内容量,然后根据需要调整视口大小。
下面的演示脚本使用QPrinter计算A4页面大小:
usage: capture.py url > webpage.png
from PyQt4 import QtCore, QtGui, QtWebKit
class WebPage(QtWebKit.QWebPage):
def __init__(self):
QtWebKit.QWebPage.__init__(self)
self.mainFrame().setScrollBarPolicy(
QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
self.mainFrame().setScrollBarPolicy(
QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)
self.mainFrame().loadFinished.connect(self.handleLoadFinished)
printer = QtGui.QPrinter()
printer.setPaperSize(QtGui.QPrinter.A4)
self.setViewportSize(printer.paperSize(
QtGui.QPrinter.DevicePixel).toSize())
def capture(self, url):
self._url = QtCore.QUrl(url)
QtCore.QTimer.singleShot(0, self.handleLoad)
def handleLoad(self):
self.mainFrame().load(self._url)
def handleLoadFinished(self):
image = QtGui.QImage(self.viewportSize(),
QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(image)
self.mainFrame().render(painter)
painter.end()
output = QtCore.QFile()
output.open(1, QtCore.QIODevice.WriteOnly)
image.save(output, 'PNG')
sys.exit(0)
if __name__ == '__main__':
import sys, signal
app = QtGui.QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)
page = WebPage()
page.capture(sys.argv[1])
sys.exit(app.exec_())