设置Python截取的截图参数

时间:2013-11-17 07:08:27

标签: python pyqt4 qtwebkit

我使用以下代码拍摄网页的屏幕截图。 从我理解的代码开始,首先将完整的页面加载到框架中,然后在画家中渲染框架。我面临的问题是,某些网页在内容方面可能非常冗长,但我只想要网页第一页的屏幕截图。有什么方法可以解决这个问题吗?

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对象的帮助下设置框架的首选大小,但它也没有帮助。 或者替代方案,有什么方法可以裁剪图像吗? 非常感谢任何帮助,谢谢。

2 个答案:

答案 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_())