免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1185 | 回复: 0
打印 上一主题 下一主题

mozilla开发笔记:生成网页缩略图 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-10 19:37 |只看该作者 |倒序浏览

    从firefox1.5开始,gecko就支持HTML标签(基于
WHATWG canvas specification
规范),它可以用来在网页上绘图、呈现UI元素等。gecko的canvas标签支持drawWindow功能,我们可以用来生成网页的缩略图。
    下面的一段C++代码可以用来生成Canvas标签以及用来绘图的上下文(目前只支持2D绘图)。
    nsCOMPtrnsIDOMElement> htmlElem;
    rv = doc->CreateElement( NS_LITERAL_STRING("canvas"), getter_AddRefs(htmlElem) );
    nsIDOMNode *added = nsnull;
    rv = parentNode->AppendChild( htmlElem, &added );
  
    nsCOMPtrnsIDOMHTMLCanvasElement> canvasNode( do_QueryInterface(htmlElem, &rv) );
  
    canvasNode->SetWidth( m_canvasSize.x() );
    canvasNode->SetHeight( m_canvasSize.y() );
    canvasNode->SetAttribute(NS_LITERAL_STRING("style"),
                             NS_LITERAL_STRING("border: 1px solid green; margin:5px;"));
    nsCOMPtrnsISupports> intf;
    rv = canvasNode->GetContext(NS_LITERAL_STRING("2d"), getter_AddRefs(intf) );
   
    nsCOMPtrnsIDOMCanvasRenderingContext2D> canvasContext( do_QueryInterface(intf, &rv) );   
一旦获得canvasContext,就可以调用drawWindow将已经打开的页面渲染到canvas中。
canvasContext->Save();
float scale = m_canvasSize.x()/(float)w > m_canvasSize.y()/(float)h?
    m_canvasSize.y()/(float)h : m_canvasSize.x()/(float)w;
canvasContext->Scale( scale, scale );               
rv = canvasContext->DrawWindow( win, 0, 0, w, h, NS_LITERAL_STRING("rgba(0,0,0,0)") );
canvasContext->Restore();
这些都比较简单,然后就是如何遍历当前打开的窗口:
nsCOMPtrnsIWindowWatcher> watcher( do_GetService(NS_WINDOWWATCHER_CONTRACTID) );
if ( watcher ) {
    nsCOMPtrnsISimpleEnumerator> i;
    rv = watcher->GetWindowEnumerator( getter_AddRefs(i) );
        
    PRBool b;
    i->HasMoreElements( &b );
    while( b != PR_FALSE ) {
        nsISupports *itf;
        i->GetNext( &itf );
        nsCOMPtrnsIDOMWindow> win( do_QueryInterface(itf, &rv) );
        if ( NS_FAILED(rv) ) {
            i->HasMoreElements( &b );
            continue;
        }
        // do something
        i->HasMoreElements( &b );
    }
}
你也可以用javascript来写上面的代码,但是注意这些代码是特权代码,也就是只能在扩展里使用的。
这些生成缩略图不好的地方在于事先要有nsIDOMWindow的指针,如果你想对还没有打开的网页生成缩略图,就不适用了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/58649/showart_525963.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP