Webページのレンダリング結果を画像で保存する
GUI機能を用いずQt WebKitの機能のみでWebベースのユーティリティプログラムを作成してみましょう。表3に挙げたQt WebKit関連のクラスの中で,
QWebPageのリファレンスマニュアル に,
$ render url [スケール]
このコマンドを実行すると指定したURLのWebページをレンダリングし,
リスト6が実装コードです。行を追って説明します。
リスト6 render.
01: #include <QtGui>
02: #include <QtWebKit>
03:
04: class Thumbnailer : public QObject
Webページへのアクセスは,
05: {
06: Q_OBJECT
07:
08: public:
09: Thumbnailer( const QUrl& url, double scale = 1.0 );
10:
11: signals:
12: void finished();
新たに追加したシグナルでWebページをロードし,
13:
14: private slots:
15: void render();
QWebPageでのロードが完了したときに呼び出す処理スロットです。
16:
17: private:
18: QWebPage page;
19: double scale;
20: };
21:
22: Thumbnailer::Thumbnailer( const QUrl& url, double scale )
23: : scale( scale )
24: {
25: page.mainFrame()->load( url );
26: connect( &page, SIGNAL( loadFinished( bool ) ), this, SLOT( render() ) );
Webページpageのメインフレームに指定されたURLを渡してロードしています。レンダリング終了はQWebPageのシグナルloadFinished(bool) でわかるので,
27: }
28:
29: void Thumbnailer::render()
30: {
31: page.setViewportSize( page.mainFrame()->contentsSize() );
QWebPageのビューポート
32:
33: QImage image( page.viewportSize(), QImage::Format_ARGB32 );
ラスターイメージデータQImageをQWebPageのビューポートと同じサイズで用意します。
34:
35: QPainter painter( &image );
36: page.mainFrame()->render( &painter );
37: painter.end();
Qtの2D描画機能を使うには,
38:
39: QImage thumbnail;
40: if ( scale == 1.0 ) {
41: thumbnail = image;
42: } else {
43: QSize size = page.viewportSize() * scale;
44: thumbnail = image.scaled( size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
45: }
46:
47: thumbnail.save( "thumbnail.png" );
48:
49: emit finished();
スケーリングした画像を格納するためにQImageのデータthumbnailを用いています。スケールが1.
50: }
51:
52: int main( int argc, char** argv )
53: {
54: QApplication app( argc, argv );
55:
56: QUrl url = QUrl( "http://trolltech.com" );
57: double scale = 1.0;
58:
59: switch ( argc ) {
60: case 2:
61: url = argv[1];
62: break;
63: case 3:
64: url = argv[1];
65: scale = QString( argv[2] ).toDouble();
66: break;
67: }
68:
69: Thumbnailer thumbnailer( url, scale );
70:
71: QObject::connect( &thumbnailer, SIGNAL( finished() ), &app, SLOT( quit() ) );
コマンドラインで指定したURLのレンダリングが完了したならば,
72:
73: return app.exec();
74: }
75:
76: #include "render.moc"