一种网页截图方法、计算机设备及可读存储介质
【技术领域】
本发明涉及计算机技术领域,具体涉及一种网页截图方法、计算机设备及可读存储介质。
【背景技术】
对网页进行截图是用户在日常工作和生活中十分常见的一个需求。目前市面上有很多客户端,诸如qq、微信、钉钉等都自带截图功能。虽然这些客户端的截图方案也基本满足了大部分场景,但是也存在很大的缺陷:1.必须安装带有截图功能的客户端;2.无法在手机端操作。这两个缺陷也导致了在一些场景下没有办法满足客户的截图需求。
【发明内容】
为解决前述问题,本发明提供了一种网页截图方法,可以在没有安装可截图客户端的电脑以及手机中对网页进行截图。
为了达到上述目的,本发明采用如下技术方案:
一种网页截图方法,包括如下步骤:
触发网页截图,创建Canvas画布1,所述Canvas画布1覆盖当前页面;
遍历当前页面的HTML元素及其CSS属性,生成渲染树;
基于所述渲染树,将网页绘制于所述Canvas画布1并显示;
在所述Canvas画布1上进行截取,将截取的内容在所述Canvas画布1上绘制生成Canvas画布2;
输出Canvas画布2的图像。
可选的,遍历当前页面的HTML元素及其CSS属性时,剔除尚未赋值或与当前页面的HTML元素位置及显示无关的CSS属性。
可选的,遍历当前页面的HTML元素及其CSS属性时,如果当前页面的某一HTML元素的父元素和/或祖先元素的CSS属性带有important,则使该HTML元素的CSS属性为其父元素和/或祖先元素的CSS属性t。
可选的,将网页绘制于所述Canvas画布1时,如果当前页面的HTML元素所拥有的CSS属性使其在页面渲染后无法被观察,则该HTML元素不绘制于所述Canvas画布1上。
可选的,将网页绘制于所述Canvas画布1后,获取当前页面的竖向滚动条属性,等比例的修改所述Canvas画布1的top属性,使所述Canvas画布1完整显示在当前页面当中。
可选的,触发网页截图,创建Canvas画布1时,获取当前页面的整体高度和宽度,创建等高等宽的Canvas画布1,将所述Canvas画布1的CSS属性position赋值为fixed,,CSS属性top和CSS属性left赋值为0,以使所述Canvas画布1覆盖当前页面。
可选的,创建Canvas画布1后,监听当前页面的resize事件,当前页面的宽度和高度发生变化时,实时对所述Canvas画布1的宽度和高度进行调整,以适配变化后的当前页面。
可选的,将截取的内容在所述Canvas画布1上绘制生成Canvas画布2时,添加截图工具,截图工具包括工具栏,工具栏包括颜色、文字、椭圆、矩形、线条、箭头、后退、完成,所述截图工具监听鼠标或屏幕点击事件,鼠标或屏幕点击事件被触发,记录当前鼠标和/或屏幕点击的位置,移动鼠标或拖动屏幕,记录移动鼠标或拖动屏幕后鼠标和/或屏幕点击的位置,形成相应的截图框,鼠标或屏幕点击事件完成,在截图框的边界创建8个可拖拽的点。
本发明具有如下有益效果:
本申请所提供的技术方案,用户可以在未安装任何客户端的情况下完成对网页的截图,也实现了在手机端对网页的截图。
同时,本发明还提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述的方法。
同时,本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述的方法。
本发明的这些特点和优点将会在下面的具体实施方式以及附图中进行详细的揭露。本发明最佳的实施方式或手段将结合附图来详尽表现,但并非是对本发明技术方案的限制。另外,在每个下文和附图中出现的这些特征、要素和组件是具有多个,并且为了表示方便而标记了不同的符号或数字,但均表示相同或相似构造或功能的部件。
【附图说明】
下面结合附图对本发明作进一步说明:
图1为本发明实施例一的流程图。
【具体实施方式】
下面结合本发明实施例的附图对本发明实施例的技术方案进行解释和说明,但下述实施例仅为本发明的优选实施例,并非全部。基于实施方式中的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得其他实施例,都属于本发明的保护范围。
在本说明书中引用的“一个实施例”或“实例”或“例子”意指结合实施例本身描述的特定特征、结构或特性可被包括在本专利公开的至少一个实施例中。短语“在一个实施例中”在说明书中的各位置的出现不必都是指同一个实施例。
实施例一:
如图1所示,本实施例提供一种网页截图方法,包括如下步骤:
触发网页截图,创建Canvas画布1。创建Canvas画布1时,获取当前页面的整体高度和宽度,创建等高等宽的Canvas画布1,将所述Canvas画布1的CSS属性position赋值为fixed,,CSS属性top和CSS属性left赋值为0,以使所述Canvas画布1覆盖当前页面。创建Canvas画布1后,监听当前页面的resize事件,当前页面的宽度和高度发生变化时,实时对所述Canvas画布1的宽度和高度进行调整,以适配变化后的当前页面。
遍历当前页面的HTML元素及其CSS属性,生成渲染树。遍历当前页面的HTML元素及其CSS属性时,剔除尚未赋值或与当前页面的HTML元素位置及显示无关的CSS属性,用以提高Canvas画布1的绘制速度。所剔除的CSS属性包括但不限于cursor、resize、nav-right等CSS属性,这些CSS属性属于并不影响HTML元素位置以及显示的CSS属性。
在遍历时,由于HTML元素的CSS属性会受父子元素的影响,因此使用深度遍历,在遍历到当前页面的某一个HTML元素的CSS属性时,如果该HTML元素的父元素和/或祖先元素的CSS属性带有important,鉴于带有important的属性其优先级最高,因此使该HTML元素的CSS属性为其父元素和/或祖先元素的CSS属性。例如父HTML元素的CSS属性带有color:red!important,而该HTML元素的CSS属性为color:blue,那么此时该HTML元素的CSS属性应为父HTML元素上的color:red!important,而不是color:blue。当遍历完整个页面的HTML元素和其CSS属性后,形成渲染树。
基于所述渲染树,将网页绘制于所述Canvas画布1,在绘制时,通过Canvas自带的API绘制到所述Canvas画布1当中,对不同类型的HTML元素使用不同的API,例如,图片使用drawImage这个API,文字使用fillText这个API,线条使用lineTo这个API等等,在此不再赘述。如果当前页面的HTML元素所拥有的CSS属性使其在页面渲染后无法被观察,则该HTML元素不绘制于所述Canvas画布1上,因为拥有这些属性的HTML元素其在页面渲染后用户并不能观察到。例如,某一HTML元素拥有position的CSS属性,需要根据其top、left、right、top等CSS属性以及父元素或祖先元素的position和overflow的CSS属性来判断其是否可能处于可视区域之外。假如其父元素上有position:relative和overflow:hidden的CSS属性,而该HTML元素上有position:absolut、top:-50px、height:100px的CSS属性,那么该HTML元素的上半部分的50px则会处于其父元素的外部,那么根据其父元素上的overfow:hidden属性,超出的部分将会被隐藏,因此,只绘制其处于父元素内部的部分。
在绘制后,获取当前页面的竖向滚动条属性,因为当前页面的内容高度可能高于可视区域的高度,其位置不一定是位于最高的位置,而是经过滚动处于中间位置,那么这时需要得到滚动条竖向滑动距离。等比例的修改所述Canvas画布1的top属性,使所述Canvas画布1完整显示在当前页面当中,然后显示绘制于所述Canvas画布1上的网页。
在所述Canvas画布1上进行截取,截取时添加截图工具,截图工具通过HTML、CSS、Javascript创建,分为截图区域以及工具栏,将截取的内容在所述Canvas画布1上绘制生成Canvas画布2,生成的Canvas画布2即截图区域。工具栏由HTML元素和CSS制作,包括颜色、文字、椭圆、矩形、线条、箭头、后退、完成。各功能的实现如下:
颜色:在当前页面全局设定一个全局变量,每次颜色改变时,修改该全局变量。当内部其他功能在使用时,使用该全局变量来指定当前绘制的颜色;
文字:监听鼠标左键点击事件,在点击位置动态创建一个Textarea元素即文本框,在用户输入完文字后并当文本框失去焦点时,即点击文本框以外的地方,获取用户输入的文字通过Canvas提供的fillText方法,将文字填写到Canvas画布2中;
椭圆:通过Canvas提供的bezierCurveTo方法,即贝塞尔曲线,以及用户的鼠标按下位置和鼠标抬起位置,画出椭圆;
矩形:通过Canvas提供的lineTo方法,以及用户的鼠标按下位置和鼠标抬起位置,画出矩形;
线条:通过Canvas提供的lineTo方法,以及用户的鼠标按下位置和鼠标抬起位置,画出线条;
箭头:通过Canvas提供的lineTo方法、Javascript提供的三角函数方法、以及用户的鼠标按下位置和鼠标抬起位置,画出箭头。
后退:实现后退方法,本实施例采用快照的方式,在前述每个功能结束后,都会记录当时Canvas画布2上的内容并形成一张快照,放置于队列当中,当用户点击后退按钮后,则会将上一次快照通过Canvas的drawImage方法绘制于Canvas画布2当中,最终实现后退功能;
完成:点击完成后,根据当前的Canvas画布2上的内容输出一张图片,并根据用户的配置,判断截取内容是否需要进行下载,或复制到粘贴板中,最后关闭截图工具,将Canvas画布1、Canvas画布2、工具栏从当前页面中删除。
截图工具监听鼠标或屏幕点击事件,鼠标或屏幕点击事件被触发,记录当前鼠标和/或屏幕点击的位置,移动鼠标或拖动屏幕,记录移动鼠标或拖动屏幕后鼠标和/或屏幕点击的位置,形成相应的截图框,也就是截图区域,即生成的Canvas画布2。鼠标或屏幕点击事件完成,在截图框的边界创建8个可拖拽的点,再将截取的内容在所述Canvas画布1上绘制生成Canvas画布2。本实施例以鼠标点击为例,当用户点击鼠标后,***会记录当前鼠标的位置,并且创建一个div标签,创建的div标签属于HTML的一个标签,通过Javascript的appendChild方法,添加到页面当中。当用户滑动鼠标后,***实时记录当前鼠标的位置,并实时计算两个位置(点击时的位置和实时滑动时的位置)之差改变div标签的height、width、left、top,使div标签能够形成一个用户所需大小的截图框。最后用户在抬起鼠标按键时,创建一个Canvas画布appendChild至div标签当中,其height和width和div标签保持一致,并且在截图框的边界创建8个可拖拽的点,提供用户后续对截图框大小以及位置的改变需求。
最后输出Canvas画布2的图像。
本实施例所提供的技术方案,用户可以在未安装任何客户端的情况下完成对网页的截图,也实现了在手机端对网页的截图。
实施例二
本实施例提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现如上所述的任意实施例中的方法。本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成。据此,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可实现上述任意一项实施例所述的方法。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)以及存储器总线动态RAM(RDRAM)等。
以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,熟悉该本领域的技术人员应该明白本发明包括但不限于附图和上面具体实施方式中描述的内容。任何不偏离本发明的功能和结构原理的修改都将包括在权利要求书的范围中。