在前篇提到利用CutyCapt來產生Web page thumbnail, 不過畢竟CutyCapt是C++寫的, build出來也是一個執行檔, 寫完上一篇就有股衝動想用PyQt來做, 反正一樣可以利用Qt/WebKit, 原理應該相同的
沒想到, 真的那麼簡單, 只用了二十幾行code就可以辦到了
這邊主要利用到的一個class就是 QWebPage , 透過這個class我們就可以很簡單的達成這任務
為了程式的重複利用性, 我把它包裝成一個class PageRender:
class PageRender(QObject):
def __init__(self, url, outfile, scale):
QObject.__init__(self)
self.outfile = outfile
self.scale = scale
self.web = QWebPage()
self.web.mainFrame().load(QUrl(url))
self.connect(self.web, SIGNAL("loadFinished(bool)") ,self.loadFinished)
def loadFinished(self, b):
print "load finished"
self.web.setViewportSize(self.web.mainFrame().contentsSize())
image = QImage(self.web.viewportSize(), QImage.Format_ARGB32);
painter = QPainter(image)
self.web.mainFrame().render(painter)
painter.end()
thumbnail = image.scaledToWidth(self.scale)
thumbnail.save(self.outfile)
app.exit(0)
在Constructor那邊做的就是把loadFinished跟我們實際處理save to thumbnail的function connect在一起
而在loadFinished那邊就是實際render到image的部份, 這邊要注意的是:
self.web.setViewportSize(self.web.mainFrame().contentsSize())
這是把QWebPage的View port size設成跟實際content一樣大, 後面接著我們就可以建立QImage跟其相對映的painter, 然後用QWebFrame的"render()"把它實際輸出到image
最後scale到我們想要的大小(pixels)
這邊是一個實際call它的範例:
p = PageRender("http://www.yahoo.com.tw", "sssss.png", 200)
結果:
實際的程式可以在此下載
沒有留言:
張貼留言