QWebView 下采样 SVG 渲染

19 投票
1 回答
2089 浏览
提问于 2025-04-16 17:38

我想用QWebView来做SVG缩略图,因为它支持滤镜(而QSvgRender只支持SVG Tiny 1.2)。使用起来感觉还不错,除了字体显示有点问题,不过可以通过fontconfig这个包来调整。现在的问题是,带有滤镜的元素似乎显示得不够清晰。没有滤镜的元素看起来很好很清晰,而带有滤镜的元素则显得像素化和模糊。

from  PyQt4.QtGui import *
from  PyQt4.QtCore import *
from PyQt4.QtSvg import *
from PyQt4.QtWebKit import *
import sys
import time

if __name__ == '__main__':

    app = QApplication(sys.argv)

    data = open('/home/xxx/workspace/yyy/zzz/out.svg').read()

    # svg = QSvgRenderer(QByteArray(data))
    qim = QImage(int(1024), int(768), QImage.Format_ARGB32)                                                                                                                                                                                 
    web = QWebView()
    web.setRenderHint(QPainter.SmoothPixmapTransform)
    web.setRenderHint(QPainter.Antialiasing)
    web.setRenderHint(QPainter.TextAntialiasing)
    painter = QPainter()

    def load_finished(ok):
        web.resize(1024,768)
        painter.begin(qim)
        # svg.render(painter)
        web.render(painter)
        painter.end()

        print "null:", qim.isNull()
        qim.save('test2.png')
        sys.exit()

    web.connect(web, SIGNAL('loadFinished(bool)'), load_finished)
    web.load(QUrl('file:///home/xxx/workspace/yyy/zzz/out.svg'))
    sys.exit(app.exec_())

这是Qt 4.7版本。同样的SVG文件在Inkscape、rsvg或者Chrome、Firefox中显示得很好。

result

1 个回答

1

试试用QWebPage这个非图形界面的渲染器来进行渲染,看看这样是否有帮助。我没有看到有什么设置会影响渲染效果。

代码大概是这样的(没检查过):

QWebPage page
QWebFrame frame = page.mainFrame()
frame.load(url)
frame.render(painter)

撰写回答