QWebView недосэмплированный рендеринг SVG - PullRequest
19 голосов
/ 14 мая 2011

Я бы хотел использовать 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 голос
/ 17 ноября 2011

Попробуйте выполнить рендеринг с использованием QWebPage (рендерер без графического интерфейса), посмотрите, поможет ли это.Я не вижу никаких настроек, которые влияют на рендеринг.

Код будет выглядеть примерно так (не проверено):

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