class ImageRenderer(QObject): def __init__(self, url, image_path): QObject.__init__(self) self.url = QUrl(url) self.image_path = image_path self.webpage = QWebPage(self) self.webpage.loadFinished.connect(self.render) self.webpage.mainFrame().load(self.url) def render(self, ok): if ok: print('Loaded {0}'.format(self.url.toString())) self.webpage.setViewportSize( self.webpage.mainFrame().contentsSize()) image = QImage(self.webpage.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) self.webpage.mainFrame().render(painter) painter.end() if image.save(self.image_path): print('Saved image to {0}'.format(self.image_path)) else: print('Could not save to {0}'.format(self.image_path)) else: print('Could not load {0.toString()}'.format(self.url)) QApplication.instance().quit()
class WebThumbnailer(QObject): finished = Signal(bool) def __init__(self, window_width, window_height): super(WebThumbnailer, self).__init__() self.ok = None self.page = QWebPage(self) self.page.mainFrame().setScrollBarPolicy( Qt.Horizontal, Qt.ScrollBarAlwaysOff) self.page.mainFrame().setScrollBarPolicy( Qt.Vertical, Qt.ScrollBarAlwaysOff) self.page.loadStarted.connect(self.on_page_started) self.page.loadFinished.connect(self.on_page_finished) self.page.networkAccessManager().finished.connect( self.on_network_finished) self.page.setViewportSize(QSize(window_width, window_height)) def on_page_started(self): logging.debug('on_page_started') self.ok = None def on_page_finished(self, ok): logging.debug('on_page_finished: ok=%s', ok) self.ok = ok self.finished.emit(ok) def on_network_finished(self, reply): logging.debug('on_network_finished: %s', reply.url().toEncoded()) def load(self, url): self.page.mainFrame().load(url) def save(self, out, width=None, height=None): image = self.render() scaled = self.scale(image, width, height) scaled.save(out) logging.debug('imagesize: %s', scaled.size()) def render(self): image = QImage(self.page.viewportSize(), QImage.Format_RGB32) painter = QPainter(image) self.page.mainFrame().render(painter) painter.end() return image def scale(self, image, width=None, height=None): if width is None and height is None: scaled = image elif width is None: scaled = image.scaledToHeight(height, Qt.SmoothTransformation) elif height is None: scaled = image.scaledToWidth(width, Qt.SmoothTransformation) else: scaled = image.scaled(width, height, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation) scaled = scaled.copy(0, 0, width, height) return scaled