生成网页缩略图的DEMO

news/2024/5/18 22:29:10 标签: qt, url, image, signal, webkit, jquery

效果:

在linux服务器上通过命令行 cmd -url 的形式 抓取制定url地址的网页缩略图,保存到本地。


实现方式: Xvfb + qtwebkit


qtwebkit 代码示例:

main.cpp

#include <QtGui> 
#include "webmock.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QUrl url = QUrl("http://www.google.com/ncr");
    url = QUrl("http://www.sina.com.cn");
    new WebMock(url);

    return a.exec();
}
webmock.h

#ifndef WEBMOCK_H
#define WEBMOCK_H

#include <QtGui> 

class QWebView;

class WebMock : public QMainWindow
{
    Q_OBJECT

public:
    WebMock(const QUrl& url);

protected slots:
    void postActions();

private:
    QString jQuery; 
    QWebView *view;
};

#endif // WEBMOCK_H
webmock.cpp
#include <QtWebKit>
#include "webmock.h"


WebMock::WebMock(const QUrl& url)
{
    QNetworkProxyFactory::setUseSystemConfiguration(true);

    view = new QWebView();
    view->load(url);

    connect(view, SIGNAL(loadFinished(bool)), SLOT(postActions()));

}

void WebMock::postActions()
{

    QWebPage *page = view->page();
    QWebFrame *frame = page->mainFrame();
    QWebElement doc = frame->documentElement();

    QWebElement elem = doc.findFirst("A");

    QSize size = frame->contentsSize();
    page->setViewportSize(size);

    QImage image = QImage(size, QImage::Format_ARGB32_Premultiplied);
    image.fill(Qt::transparent);

    QPainter p(&image);
    p.setRenderHint(QPainter::Antialiasing, true);
    p.setRenderHint(QPainter::TextAntialiasing, true);
    p.setRenderHint(QPainter::SmoothPixmapTransform, true);

    QPen pen(Qt::green, 2, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
    p.setPen(pen);

    frame->render(&p);

    QRect rect = elem.geometry();
    p.drawRect(rect);

    p.end();

    image.save("./webpage.jpg");

    this->close();

}

项目文件 test.pro

QT       += core webkit network


SOURCES += main.cpp \
    webmock.cpp

HEADERS += \
    webmock.h

通过qmake编译完毕之后, 运行,系统提示 cannot connect to x server。


现在需要使用 xvfb。

命令:nohup /usr/bin/Xvfb :1 -screen 0 1024x768x8 & 启动。(:1 定义屏幕ID width*height*depth 8 16 24 etc)


然后:DISPLAY=:1 ./test (屏幕ID1 执行 test)

运行 编译好的可执行文件 test。 即可在运行目录下得到 网页截图 webpage.jpg。


彩蛋:

    QWebElement elem = doc.findFirst("A");
    //some other code

    QRect rect = elem.geometry();
    p.drawRect(rect);

4.7提供的QWebElement接口中的 findXXX 方法 提供了 基于标准 CSS3 的 selector 语法。只给对DOM的操作提供了很大的便利。

以上代码的作用稍作扩展,就可以实现:查询的关键字或者文段或者区块在保存的图片中高亮标记的功能。

从这里出发,可以粗略实现google的缩略图功能:



当然,gg并没有在生成图片的时候高亮标记,而是记录文段的位置在web前端用css+js实现了标志。

有空再来研究这个功能。


References:

http://dadicy.wordpress.com/tag/xvfb/

http://www.x.org/releases/X11R7.6/doc/man/man1/Xvfb.1.xhtml

http://corpocrat.com/2008/08/19/how-to-install-xvfb-x11-server-in-linux-server/

http://semicomplete.com/blog/geekery/xvfb-firefox.html

http://www.xxlinux.com/linux/article/accidence/install/20100330/18150.html

http://www.mysql-apache-php.com/website_screenshot.htm

知识共享许可协议
本 作品采用 知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

http://www.niftyadmin.cn/n/1858947.html

相关文章

捕获程序异常之tryCatch

一、try catch语法try…catch…finally…语法中除了try以外&#xff0c;catch和finally都是可选的&#xff08;两者必须要有一个&#xff09;&#xff0c;也就是说try…catch…finally…语法有以下三种形式。 形式1 try{ //do something } catch(e){ //somecode } finally{ //d…

在tomcat容器内停止tomcat服务的方法

在servlet 或者 jsp 中调用&#xff1a;try{MBeanServer server MBeanUtils.createServer();ObjectName name new ObjectName("Catalina:typeService,serviceNameCatalina");server.invoke(name, "stop", new Object[0], new String[0]); } catch (Excep…

4.3二叉树

4.3二叉树 基础概念&#xff1a; 二叉树n个结点的有限集合&#xff1a; 1.或者为空二叉树&#xff0c;即n0。 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。 特性&#xff1a; 1.每个结点最多有两颗子树。 2.左…

qt-mysql driver conflits with Webkit on compilation

When i compliing mysql driver for qt47 in mac os, an error is threw : > bindings/js/JSPluginCustom.cpp:38: error: invalid use of incomplete type > ‘struct WebCore::Plugin’ > generated/JSPlugin.h:30: error: forward declaration of ‘struct > …

mysql中连接失败2003错误解决办法

在使用mysql数据库&#xff0c;新建连接时&#xff0c;会报2003-Cant connect to server on localhost(10038)错误&#xff0c;原因主要是MYSQL服务没有启动起来&#xff0c;但是进入&#xff1a;计算机——管理——服务中&#xff0c;找不到MYSQL服务&#xff0c;主要解决办法…

4.4二叉树的存储结构

4.4二叉树的存储结构 顺序存储 定义&#xff1a;用一组地址连续的存储单元依次自上而下&#xff0c;自左至右存储完全二叉树上的结点元素。 这种存储浪费存储空间所以考虑链式。 链式存储&#xff1a; 二叉树每个结点最多两个孩子&#xff0c;所以设计二叉树的结点结构时堪…

4.5二叉树的遍历

4.5二叉树的遍历 定义&#xff1a;二叉树的遍历是指按某种次序依次访问树中的每个结点&#xff0c;是得每个结点均被访问一次。 &#xff08;递归&#xff09; 1.先序遍历 操作过程&#xff1a; 为空&#xff0c;什么也不做&#xff1b;&#xff08;递归边界&#xff09; …

android事件系列-onTouch事件与手势操作

提示记忆&#xff1a;应用流程&#xff1a;在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法&#xff0c;重点再于理解里面的方法的实现步骤&#xff0c;触摸&#xff0c;手势操作已经很好的融入了我们的生活。那么…