canvas绘制的文字如何提取

canvas绘制的文字如何提取,第1张

1、能直接复制的直接复制就行

2、框选文字,拖动到QQ,word等编辑框中

3、通过F12打开检查界面,选择对应元素

如果F12打不开,请尝试右键检查

4、如果遇到文字是通过画布canvas()画出来的,可以在源代码中搜索相关文字,找到对应片段,复制下来,通过脚本提取出中文

如果没有python环境,其他编程语言也写这个脚本

DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到。比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行 *** 作。比如有一个 元素,可以直接用jquery增加click事件$('#p1')click(function(){…})"。然而这种DOM处理方法在HTML5的Canvas里不再适用,Canvas使用的是另外一套机制,无论在Canvas上绘制多少图形,Canvas都是一个整体,图形本身实际都是Canvas的一部分,不可单独获取,所以也就无法直接给某个图形增加JavaScript事件。

Canvas的限制

在Canvas里,所有图形都绘制在帧上,绘制方法不会将绘制好的图形元素作为一个返回值输出,js也无法获取到已经绘制好的图形元素。比如:

代码如下:

cvs = documentgetElementById('mycanvas');

ctx = canvasgetContext('2d');

theRect = ctxrect(10, 10, 100, 100);

ctxstroke();

consolelog(theRect); //undefined

这段代码在canvas标签里绘制了一个矩形,首先可以看到绘制图形的rect方法没有返回值。如果打开浏览器的开发者工具,还可以看到canvas标签内部没有增加任何内容,而在js里获取到的canvas元素以及当前的上下文,也都没有任何表示新增图形的内容。

所以,前端常用的dom方法在canvas里是不适用的。比如点击上面Canvas里的矩形,实际点击的是整个Canvas元素。

给Canvas元素绑定事件

由于事件只能达到Canvas元素这一层,所以,如果想进一步深入,识别点击发生在Canvas内部的`哪一个图形上,就需要增加代码来进行处理。基本思路是:给Canvas元素绑定事件,当事件发生时,检查事件对象的位置,然后检查哪些图形覆盖了该位置。比如上面的例子里画过一个矩形,该矩形覆盖x轴10-110、y轴10-110的范围。只要鼠标点击在这个范围里,就可以视为点击了该矩形,也就可以手动触发矩形需要处理的点击事件。思路其实比较简单,但是实现起来还是稍微有点复杂。不仅要考虑这个判断过程的效率,有些地方还需要重新判断事件类型,设置要重新定义一个Canvas内部的捕获和冒泡机制。

首先要做的,是给Canvas元素绑定事件,比如Canvas内部某个图形要绑定点击事件,就需要通过Canvas元素代理该事件:

代码如下:

cvs = documentgetElementById('mycanvas');

cvsaddEventListener('click', function(e){

//

}, false);

接下来需要判断事件对象发生的位置,事件对象e的layerX和layerY属性表示Canvas内部坐标系中的坐标。但是这个属性Opera不支持,Safari也打算移除,所以要做一些兼容写法:

代码如下:

function getEventPosition(ev){

var x, y;

if (evlayerX || evlayerX == 0) {

x = evlayerX;

y = evlayerY;

} else if (evoffsetX || evoffsetX == 0) { // Opera

x = evoffsetX;

y = evoffsetY;

}

return {x: x, y: y};

}

//注:使用上面这个函数,需要给Canvas元素的position设为absolute。

现在有了事件对象的坐标位置,下面就要判断Canvas里的图形,有哪些覆盖了这个坐标。

isPointInPath方法

Canvas的isPointInPath方法可以判断当前上下文的图形是否覆盖了某个坐标,比如:

代码如下:

cvs = documentgetElementById('mycanvas');

ctx = canvasgetContext('2d');

ctxrect(10, 10, 100, 100);

ctxstroke();

ctxisPointInPath(50, 50); //true

ctxisPointInPath(5, 5); //false

接下来增加一个事件判断,就可以判断一个点击事件是否发生在矩形上:

代码如下:

cvsaddEventListener('click', function(e){

p = getEventPosition(e);

if(ctxisPointInPath(px, py)){

//点击了矩形

}

}, false);

以上就是处理Canvas事件的基本方法,但是上面的代码还有局限,由于isPointInPath方法仅判断当前上下文环境中的路径,所以当Canvas里已经绘制了多个图形时,仅能以最后一个图形的上下文环境来判断事件,比如:

代码如下:

本文实例为大家分享了canvas图像截取的具体代码,供大家参考,具体内容如下

<!DOCTYPE

html>

<html>

<head

lang="en">

<meta

charset="UTF-8">

<title>canvas-图像截取</title>

<style>

canvas{

border:

1px

dashed

red;

float:

left;

position:

relative;

}

</style>

</head>

<body>

<div

id="cantox"

style="position:

relative">

<canvas

id="oldcanvas"

width="500px"

height="300px">

</canvas>

<div

id="cliptox"

style="position:

absolute;display:none"></div>

</div>

<button

id

="btnclip"

style="float:

left">截取该区域</button>

<canvas

id="nowcanvas"

width="500px"

height="300px"

>

</canvas>

<script>

//获取div元素

var

cantox

=

documentgetElementById("cantox");

var

cliptox

=

documentgetElementById("cliptox");

var

btnclip

=

documentgetElementById("btnclip");

//获取到canvas元素

var

oldcanvas

=

documentgetElementById("oldcanvas");

var

nowcanvas

=

documentgetElementById("nowcanvas");

//获取canvas中的画图环境

var

oldcontext

=

oldcanvasgetContext('2d');

var

nowcontext

=

nowcanvasgetContext('2d');

var

img

=

new

Image();

imgsrc

=

"/image/liuyifeijpg";

//加载图像到canvas画布中

windowonload

=

function

(){

oldcontextdrawImage(img,0,0,oldcanvaswidth,oldcanvasheight);

}

var

startPoint;//截取图像开始坐标

var

endPoint;//截图图像的结束坐标

var

w;

//截取图像的宽度

var

h;

//截取图像的高度

var

flag

=

false;

//用于判断移动事件事物控制

//鼠标按下事件

cantoxonmousedown

=

function

(e){

flag

=

true;

cliptoxstyledisplay

=

'block';

startPoint

=

windowToCanvas(oldcanvas,

eclientX,

eclientY);

cliptoxstyleleft

=

startPointx+'px';

cliptoxstyletop

=

startPointy+'px';

}

//鼠标移动事件

cantoxonmousemove

=

function

(e){

if(flag){

cliptoxstylebackground

=

'rgba(0,0,0,05)';

endPoint

=

windowToCanvas(oldcanvas,

eclientX,

eclientY);

w

=

endPointx

-

startPointx;

h

=

endPointy

-

startPointy;

cliptoxstylewidth

=

w

+'px';

cliptoxstyleheight

=

h+'px';

}

}

//鼠标释放事件

cantoxonmouseup

=

function

(e){

flag

=

false;

}

//按钮截取事件

btncliponclick

=

function

(){

imgCut(nowcontext,img,oldcanvaswidth,oldcanvasheight,startPointx,startPointy,w,h);

}

/

图像截取函数

context:绘制环境对象

image:图像对象

imgElementW:图像显示的宽度

imgElementH:图像显示的高度

sx:截取图像的开始X坐标

sy:截取图像的开始Y坐标

w:截取图像的宽度

h:截取图像的高度

/

function

imgCut(context,image,imgElementW,imgElementH,sx,sy,w,h){

//清理画布,便于重新绘制

contextclearRect(0,0,imgElementW,imgElementH);

//计算

:比例

=

原图像/显示图像

var

ratioW

=

imagewidth/imgElementW;

var

ratioH

=

imageheight/imgElementH;

//根据截取图像的所占位置及大小计算出在原图所占的位置及大小

//drawImage(图像对象,原图像截取的起始X坐标,原图像截取的起始Y坐标,原图像截取的宽度,原图像截取的高度,

//

绘制图像的起始X坐标,绘制图像的起始Y坐标,绘制图像所需要的宽度,绘制图像所需要的高度);

contextdrawImage(image,ratioWsx,ratioHsy,ratioWw,ratioHh,0,0,w,h);

}

/

坐标转换:将window中的坐标转换到元素盒子中的坐标,并返回(x,y)坐标

element:canvas元素对象

x:鼠标在当前窗口X坐标值

y:鼠标在当前窗口Y坐标值

/

function

windowToCanvas(element,x,y){

//获取当前鼠标在window中的坐标值

//

alert(eventclientX+"-------"+eventclientY);

//获取元素的坐标属性

var

box

=

elementgetBoundingClientRect();

var

bx

=

x

-

boxleft;

var

by

=

y

-

boxtop;

return

{x:bx,y:by};

}

</script>

</body>

</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

canvas本身没有绘画能力,它的绘制工作必须在JavaScript的内部完成。

getContext():getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。所以获取绘图环境是通过调试canvas对象的getContext()方法。

2017年12月28日

canvas 是一张画布,仅有一个DOM元素,浏览器没有内置多余的API,所有的交互需要开发直接实现。

规则的几何形状,如矩形、圆形等,可通过简单的数学计算获得。

这是用 canvas 做的一个关系网络图,鼠标可以自由拖动节点。这个场景下交互很简单,鼠标点击画布,在事件中获取X,Y坐标,然后计算每一个节点,看是否落在这个节点的半径内。如果是,则标记为选中了。

然而,不规则图形会大大加大计算复杂度,如涉及贝塞尔曲线、旋转等。

可使用 “包围盒” 的方式,将不规则图形简单化

把复杂路径简单化,再次回归到方形、圆形等规则图形上去。

但如果你需要的是一种非常精准无误差的选取方式,那这种包围盒方式就不适用了,下面是两种 canvas 精确选取方式:

需额外新增一张仅用来存信息的canvas(不插入html里面)

当在正常的canvas上绘制图形时,同时在那张隐式的canvas中也绘制一遍,并把图形的索引值作为颜色值来绘制图形

ctxgetImageData(x,y,width,height);

ImageData 对象

R - 红色 (0-255)

G - 绿色 (0-255)

B - 蓝色 (0-255)

A - alpha 通道 (0-255)

重走一遍绘制流程,但不真正的绘制出来(不调用stroke 和 fill )图形),而只调用 isPointInPath()方法判断点是否在图形中,如果在则终止。

MDN - getBoundingClientRect

整理了一些有关canvas的属性( ’ - ’ )

canvas画布

用于绘制图像,本身不具备绘制能力,需要通过脚本来完成绘画,通常这个脚本就是javascript

canvas的默认宽高为300150,不能通过css或行内样式修改它的宽高,它有自己的宽高属性

canvas是一个html元素,通过js来执行绘制

getContext()是用来获取canvas上下文渲染环境和绘画功能的方法,目前只有一个参数:'2d',代表返回一个2d的绘制环境,将来有可能3d,但是目前不支持

它可以做什么?

  html5小游戏

  绘制,图标,图表,曲线图等等,例如地图上的热力图等等

  以及各种酷炫的动画效果都可以通过canvas来完成(可以了解一下WEBGL<>

以上就是关于canvas绘制的文字如何提取全部的内容,包括:canvas绘制的文字如何提取、HTML5中Canvas的事件处理介绍、canvas实现图像截取功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9810721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存