加载带框架的页面以获取屏幕截图

3 投票
1 回答
1692 浏览
提问于 2025-04-16 00:09

我有一个应用程序,它在一个iframe里显示网页,然后在一个覆盖在框架上的div里加载若干张图片。

我写了一个Python脚本来加载这个网址,并截取屏幕截图。这个脚本在普通网页上运行得很好,但我觉得iframe可能让它出问题了。下面是我的代码,还有一个链接是它截取的屏幕截图。

#!/usr/bin/env python
import sys
import signal

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage

def onLoadFinished(result):
    if not result:
        print "Request failed"
        sys.exit(1)

    #screen = QtGui.QDesktopWidget().screenGeometry()
    size = webpage.mainFrame().contentsSize()
    # Set the size of the (virtual) browser window
    webpage.setViewportSize(webpage.mainFrame().contentsSize())

    # Paint this frame into an image
    image = QImage(webpage.viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    webpage.mainFrame().render(painter)
    painter.end()
    image.save("/var/www/html/output.png")
    sys.exit(0)


qtargs = [sys.argv[0]]
qtargs.append("-display")
qtargs.append(":0")

app = QApplication(qtargs,True)
#app = QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)

webpage = QWebPage()
webpage.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
webpage.mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.mainFrame().load(QUrl("http://localhost/heatmap"))

sys.exit(app.exec_())

截图如下: http://img28.imageshack.us/img28/7506/outputc.png

从上面的图片可以看到,网页被缩小成了一个小图像,并且有滚动条,没能显示整个页面,包括iframe和上面的div。我是不是需要加载样式表,或者强制它像在浏览器里那样渲染?Qt.ScrollbarAlwaysOff在我的情况下似乎并没有起作用。那段“占位文本”是网页的一部分,而图片让它看起来有点灰,左上角还有一个蓝色的标记和颜色键。

当我打印网页.mainFrame().contentsSize()的内容时,得到的是 PyQt4.QtCore.QSize(400, 158)

但当我渲染像www.google.com这样的网页时,得到的是 PyQt4.QtCore.QSize(617, 573)

所以似乎有什么东西没有正确加载,导致contentsSize()出问题。你们觉得我哪里做错了?

1 个回答

0

一种方法是在加载页面之前,使用 QWebPage.setPreferredContentsSize() 设置一个合适的首选大小。这样,你的框架大小就会始终保持在这个首选大小上。(这样做还可以让某些页面的显示效果更合理,而不是使用非常小的宽度)

如果不这样做,你就需要自己遍历所有的子框架,并计算主框架的大小,这样会变得相当复杂,而且可能会出现不正确的情况。

撰写回答