任云峰 發表於 2021-8-4 17:25:00

HTML5(六)——Canvas 高级操作

<p data-track="1">上一篇文章《HTML5(五)——Canvas API》介绍 canvas 绘制基本图形,这节开始介绍canvas的高级操作。</p>
<h2 class="pgc-h-arrow-right" data-track="2">一、canvas 转换</h2>
<p data-track="19">canvas 转换常用的几种方法介绍,如下:</p>
<div class="tableWrapper">
<div class="syl-shadow-provider">
<div class="syl-table-wrap">
<table><colgroup><col><col></colgroup>
<tbody>
<tr>
<td>
<p data-track="18">方法</p>
</td>
<td>
<p data-track="7">描述</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="8">scale()</p>
</td>
<td>
<p data-track="9">缩放当前绘图至更大或更小。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="10">rotate()</p>
</td>
<td>
<p data-track="11">旋转当前绘图。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="12">translate()</p>
</td>
<td>
<p data-track="13">重新映射画布上的 (0,0) 位置。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="14">transform()</p>
</td>
<td>
<p data-track="15">替换绘图的当前转换矩阵。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="16">setTransform()</p>
</td>
<td>
<p data-track="17">将当前转换重置为单位矩阵。然后运行 transform()。</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p data-track="4"><strong>1.1 、scale - 缩放</strong></p>
<p data-track="5">使用语法:scale(x,y)</p>
<p data-track="20">x:表示水平方向的缩放倍数</p>
<p data-track="21">y:表示垂直方向的缩放倍数</p>
<p data-track="23">eg:canvas 绘制的矩形框放大两倍,代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)
ctx.scale(</span>2,2<span style="color: rgba(0, 0, 0, 1)">)
ctx.fillStyle</span>="red"<span style="color: rgba(0, 0, 0, 1)">
ctx.fillRect(</span>0,0,200,200)</pre>
</div>
<p>&nbsp;</p>
<p data-track="22"><strong>1.2、translate - 画布平移</strong></p>
<p data-track="31">使用语法:translate(x,y)</p>
<p data-track="32">x:添加到水平坐标上的位置</p>
<p data-track="33">y:添加到垂直坐标上的位置</p>
<p data-track="34">设置之后开始绘制的图片位置从(x,y)算起。</p>
<p data-track="35">eg:绘制两个一样的矩形,一个在平移前绘制,一个在平移后绘制,代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)
ctx.fillStyle</span>="red"<span style="color: rgba(0, 0, 0, 1)">
      
ctx.fillRect(</span>0,0,200,200<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">平移</span>
ctx.translate(200,200<span style="color: rgba(0, 0, 0, 1)">)
ctx.fillRect(</span>0,0,200,200)</pre>
</div>
<p data-track="30">运行结果如图:</p>
<div class="pgc-img"><img alt="HTML5(六)——Canvas 高级操作" class="syl-page-img lazyload" data-src="https://p1-tt.byteimg.com/origin/pgc-image/94f9919816944aa4bfa8f0bc4f5bb70e?from=pc">
<p class="pgc-img-caption">&nbsp;</p>
</div>
<p data-track="37"><strong>1.3 、rotate&nbsp;- 旋转</strong></p>
<p data-track="6">使用语法:rotate(angle)</p>
<p data-track="25">angle 旋转弧度,如果想使用角度,可以把角度转成弧度,公式为:deg * Path.PI/180。</p>
<p data-track="26">eg:将一个矩形旋转45度,代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">旋转45度</span>
ctx.rotate(45*Math.PI/180)
ctx.fillStyle="red"<span style="color: rgba(0, 0, 0, 1)">
ctx.fillRect(</span>0,0,200,200)</pre>
</div>
<p>&nbsp;</p>
<p data-track="28">运行结果如图:</p>
<div class="pgc-img"><img alt="HTML5(六)——Canvas 高级操作" class="syl-page-img lazyload" data-src="https://p1-tt.byteimg.com/origin/pgc-image/5543a134087f40c5861c58dd3a303013?from=pc">
<p class="pgc-img-caption">&nbsp;</p>
</div>
<p data-track="40">根据上述结果我们发现旋转的时候,默认原点是画布的起始点,我们想要的旋转是在矩形框中心为原点的旋转,此时我们需要借助上translate平移,重置一下原点,修改上述代码为:</p>
<div class="cnblogs_code">
<pre>&lt;canvas width="400" height="400" id="canvas"&gt;&lt;/canvas&gt;

<span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)

ctx.translate(</span>200,200<span style="color: rgba(0, 0, 0, 1)">)
ctx.rotate(</span>45*Math.PI/180)
ctx.translate(-200,-200<span style="color: rgba(0, 0, 0, 1)">)

ctx.fillStyle</span>="red"<span style="color: rgba(0, 0, 0, 1)">
ctx.fillRect(</span>100,100,200,200)</pre>
</div>
<p data-track="42">运行结果如图:</p>
<div class="pgc-img"><img alt="HTML5(六)——Canvas 高级操作" class="syl-page-img lazyload" data-src="https://p1-tt.byteimg.com/origin/pgc-image/b60f2108fa904bdabc82afac6d535319?from=pc">
<p class="pgc-img-caption">&nbsp;</p>
</div>
<p data-track="44"><strong>1.4、transform - 矩阵变换</strong></p>
<p data-track="46">使用语法:transform(a,b,c,d,e,f)</p>
<ul>
<li data-track="47">a:水平缩放</li>
<li data-track="48">b:水平倾斜</li>
<li data-track="49">c:垂直倾斜</li>
<li data-track="50">d:垂直缩放</li>
<li data-track="51">e:水平移动</li>
<li data-track="52">f:垂直移动</li>
</ul>
<p data-track="54">transform可以替代前边平移、缩放、旋转三者,如下:</p>
<pre class="syl-page-code hljs php"><code><span class="hljs-comment">// 平移
translate(x,y) &lt;=&gt; transform(<span class="hljs-number">1,<span class="hljs-number">0,<span class="hljs-number">0,<span class="hljs-number">1,x,y) &lt;=&gt; transform(<span class="hljs-number">0,<span class="hljs-number">1,<span class="hljs-number">1,<span class="hljs-number">0,x,y)</span></span></span></span></span></span></span></span></span></code></pre>
<pre class="syl-page-code hljs php"><code><span class="hljs-comment">// 缩放
sacle(x,y) &lt;=&gt; transform(x,<span class="hljs-number">0,<span class="hljs-number">0,y,<span class="hljs-number">0,<span class="hljs-number">0) </span></span></span></span></span></code></pre>
<pre class="syl-page-code hljs javascript"><code><span class="hljs-comment">// 旋转
rotate(angle) &lt;=&gt; transform(<span class="hljs-built_in">Math.cos(angle*<span class="hljs-built_in">Math.PI/<span class="hljs-number">180), <span class="hljs-built_in">Math.sin(angel*<span class="hljs-built_in">Math.PI/<span class="hljs-number">180), -<span class="hljs-built_in">Math.sin(angle*<span class="hljs-built_in">Math.PI/<span class="hljs-number">180), <span class="hljs-built_in">Math.cos(angle*<span class="hljs-built_in">Math.PI/<span class="hljs-number">180))</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p data-track="57"><strong>1.5、setTransform - 矩阵变换</strong></p>
<p data-track="58">setTransform()方法将变换的矩阵进行重置,它把当前的变换矩阵重置为单位矩阵<br class="sysbr">使用语法:transform(a,b,c,d,e,f)<br>各参数说明:水平旋转、水平倾斜、垂直倾斜、垂直缩放、水平移动、垂直移动</p>
<p data-track="59">setTransform() 方法把当前的变换矩阵重置为单位矩阵,然后以相同的参数运行&nbsp;transform()。</p>
<h2 class="pgc-h-arrow-right" data-track="60">二、canvas 操作图片</h2>
<p data-track="62">drawImage() 在画布上绘制图像、画布或视频。也能够绘制图片的一部分,增加或减少图像的尺寸。以下是三种常见使用语法:</p>
<ul>
<li data-track="65">语法1:drawImage( img , x , y )</li>
<li data-track="67">语法2:drawImage( img , x , y , width , height )</li>
<li data-track="68">语法3:drawImage( img , sx , sy , swidth, sheight , x , y , width , height )</li>

</ul>
<p data-track="69">上述参数表示的意义如下:</p>
<div class="tableWrapper">
<div class="syl-shadow-provider">
<div class="syl-table-wrap">
<table><colgroup><col><col></colgroup>
<tbody>
<tr>
<td>
<p data-track="91">参数</p>

</td>
<td>
<p data-track="71">描述</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="72">img</p>

</td>
<td>
<p data-track="73">规定要使用的图像、画布或视频。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="74">sx</p>

</td>
<td>
<p data-track="75">可选。开始剪切的 x 坐标位置。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="76">sy</p>

</td>
<td>
<p data-track="77">可选。开始剪切的 y 坐标位置。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="78">swidth</p>

</td>
<td>
<p data-track="79">可选。被剪切图像的宽度。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="80">sheight</p>

</td>
<td>
<p data-track="81">可选。被剪切图像的高度。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="82">x</p>

</td>
<td>
<p data-track="83">在画布上放置图像的 x 坐标位置。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="84">y</p>

</td>
<td>
<p data-track="85">在画布上放置图像的 y 坐标位置。</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="86">width</p>

</td>
<td>
<p data-track="87">可选。要使用的图像的宽度。(伸展或缩小图像)</p>

</td>

</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="88">height</p>

</td>
<td>
<p data-track="89">可选。要使用的图像的高度。(伸展或缩小图像)</p>

</td>

</tr>

</tbody>

</table>

</div>

</div>

</div>
<p data-track="90">eg:利用语法3,进行绘制图片的部分内容,实现如下效果:</p>
<div class="pgc-img"><img alt="HTML5(六)——Canvas 高级操作" class="syl-page-img lazyload" data-src="https://p3-tt.byteimg.com/origin/pgc-image/2084277ffb7847d1b99adecf78d20173?from=pc">
<p class="pgc-img-caption">&nbsp;</p>

</div>
<p data-track="93">给上述兔子顺便加一个点击屏幕暂停开始功能,完整代码如下:</p>
<div class="cnblogs_code">
<pre>&lt;canvas width="400" height="400" id="canvas"&gt;&lt;/canvas&gt;
&lt;script&gt;
<span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> img = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Image()
let pause </span>= <span style="color: rgba(0, 0, 255, 1)">false</span>,frameCounter = 0,i=0<span style="color: rgba(0, 0, 0, 1)">;
img.src </span>= "./rotate.png"<span style="color: rgba(0, 0, 0, 1)">
img.onload </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
requestAnimationFrame(next)
}
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> next(){
ctx.clearRect(</span>0,0<span style="color: rgba(0, 0, 0, 1)">,canvas.width,canvas.height)
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(frameCounter%5 == 0){ <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">frameCounter 控制动画速度</span>
i++
<span style="color: rgba(0, 0, 255, 1)">if</span>(i==11)i=0<span style="color: rgba(0, 0, 0, 1)">
}
ctx.drawImage(img,
</span>0,i*240,240,240<span style="color: rgba(0, 0, 0, 1)">,
</span>0,0,240,240) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 每张图片宽高都是240,具体参数根据图片而定</span>
frameCounter ++
<span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 0, 1)">pause)requestAnimationFrame(next)
}
window.onclick </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
pause </span>= !<span style="color: rgba(0, 0, 0, 1)">pause
next()
}
</span>&lt;/script&gt;</pre>
</div>
<p>&nbsp;</p>
<p data-track="94">eg:使用 canvas 画布处理视频,使用定时器绘制视频的当前帧,连续起来就是一个视频,需要注意的是必须处理暂停和开始播放两种操作,具体代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> v=document.getElementById("video1"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> c=document.getElementById("myCanvas"<span style="color: rgba(0, 0, 0, 1)">);
ctx</span>=c.getContext('2d'<span style="color: rgba(0, 0, 0, 1)">);
v.addEventListener(</span>'play',<span style="color: rgba(0, 0, 255, 1)">function</span>() {<span style="color: rgba(0, 0, 255, 1)">var</span> i=window.setInterval(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">()
{ctx.drawImage(v,</span>0,0,270,135)},20);},<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
v.addEventListener(</span>'pause',<span style="color: rgba(0, 0, 255, 1)">function</span>() {window.clearInterval(i);},<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
v.addEventListener(</span>'ended',<span style="color: rgba(0, 0, 255, 1)">function</span>() {clearInterval(i);},<span style="color: rgba(0, 0, 255, 1)">false</span>);</pre>
</div>
<p>&nbsp;</p>
<h2 class="pgc-h-arrow-right" data-track="102">三、像素级操作</h2>
<p data-track="95">常见的像素级的操作有三种:</p>
<ul>
<li data-track="98">getImageData() - 获取画布像素数据</li>
<li data-track="99">createImageData() - 创建新的、空白像素</li>
<li data-track="100">putImageData() - 图像像素数据放回画布</li>
</ul>
<p data-track="101"><strong>3.1、getImageData</strong></p>
<p data-track="105">使用语法:getImageData( x , y , width , height )</p>
<ul>
<li data-track="106">x:要被提取的图像数据矩形区域的左上角 x 坐标。</li>
<li data-track="107">y:要被提取的图像数据矩形区域的左上角 y 坐标。</li>
<li data-track="108">width:被提取的图像数据矩形区域的宽度</li>
<li data-track="109">height:被提取的图像数据矩形区域的高度</li>
</ul>
<p data-track="111">返回一个 imageData 对象,用来描述 canvas 区域隐含的像素数据,这个区域通过像素表示,起点是( x , y ),宽高为 widht 和 height 。</p>
<p data-track="112">imageData 对象包含三个属性:</p>
<ul>
<li data-track="113">imageData.height - 像素描述的矩形实际高度。</li>
<li data-track="114">imageData.width - 像素描述的矩形实际宽度。</li>
<li data-track="115">imageData.data - 包含 rgba 顺序数据的一个数组,数据使用0-255直接整数表示。</li>
</ul>
<p data-track="103"><strong>3.2、createImageData</strong></p>
<p data-track="116">使用语法:</p>
<p class="syl-line-pure-english" data-track="117">createImageData( width , height )</p>
<p data-track="118">创建一个空白的 imageData 对象,新对象的默认像素值 transparent black。对于imageData对象中的每个像素值,都存在 rgba 这四方面的信息,即:</p>
<ul>
<li data-track="120">r - 红色(0-255)</li>
<li data-track="121">g - 绿色(0-255)</li>
<li data-track="122">b - 蓝色(0-255)</li>
<li data-track="123">a - alpha(0-255,0是透明,255是完全可见)</li>
</ul>
<p data-track="124">新对象默认像素值为(0,0,0,0)。</p>
<p data-track="126">eg:如果我们想把 imageData 中一个像素变为红色时,可以改变第一和第四位信息,代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> imageData = ctx.createImageData(100,100<span style="color: rgba(0, 0, 0, 1)">)
imageData.data[</span>0] = 255<span style="color: rgba(0, 0, 0, 1)">
imageData.data[</span>1] = 0<span style="color: rgba(0, 0, 0, 1)">
imageData.data[</span>2] = 0<span style="color: rgba(0, 0, 0, 1)">
imageData.data[</span>3] = 255</pre>
</div>
<p>&nbsp;</p>
<p data-track="104"><strong>3.1、putImageData</strong></p>
<p data-track="128">使用语法:</p>
<p class="syl-line-pure-english" data-track="130">putImageData( imgData , x , y , dirtyX , dirtyY , dirtyWidth ,dirtyHeight );</p>
<p data-track="131">参数及意义:</p>
<div class="tableWrapper">
<div class="syl-shadow-provider">
<div class="syl-table-wrap">
<table><colgroup><col><col></colgroup>
<tbody>
<tr>
<td>
<p data-track="149">参数</p>
</td>
<td>
<p data-track="133">描述</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="134">imgData</p>
</td>
<td>
<p data-track="135">规定要放回画布的 ImageData 对象。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="136">x</p>
</td>
<td>
<p data-track="137">ImageData 对象左上角的 x 坐标,以像素计。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="138">y</p>
</td>
<td>
<p data-track="139">ImageData 对象左上角的 y 坐标,以像素计。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="140">dirtyX</p>
</td>
<td>
<p data-track="141">可选。水平值(x),以像素计,在画布上放置图像的位置。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="142">dirtyY</p>
</td>
<td>
<p data-track="143">可选。水平值(y),以像素计,在画布上放置图像的位置。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="144">dirtyWidth</p>
</td>
<td>
<p data-track="145">可选。在画布上绘制图像所使用的宽度。</p>
</td>
</tr>
<tr>
<td>
<p class="syl-line-pure-english" data-track="146">dirtyHeight</p>
</td>
<td>
<p data-track="147">可选。在画布上绘制图像所使用的高度。</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p data-track="148">通过 getImageData 复制的指定矩形像素数据,编辑之后,通过 putImageData 方法将图像数据放回画布上。</p>
<p data-track="150">eg:添加滤镜效果:上述兔子是白色的变换成红色兔子,这时需要把绿色和蓝色都设置成0即可,代码如下:</p>
<div class="cnblogs_code">
<pre>&lt;canvas width="400" height="400" id="canvas"&gt;&lt;/canvas&gt;
&lt;script&gt;
<span style="color: rgba(0, 0, 255, 1)">var</span> canvas = document.getElementById("canvas"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ctx = canvas.getContext("2d"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> img = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Image()
let w </span>= canvas.width,h =<span style="color: rgba(0, 0, 0, 1)"> canvas.height;
img.src </span>= "./rotate.png"<span style="color: rgba(0, 0, 0, 1)">
img.onload </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
ctx.drawImage(img,</span>0,0,240,240,0,0,240,240<span style="color: rgba(0, 0, 0, 1)">)
let imageData </span>= ctx.getImageData(0,0<span style="color: rgba(0, 0, 0, 1)">,w,h)
</span><span style="color: rgba(0, 0, 255, 1)">for</span>(let r=0;r&lt;w;r++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">for</span>(let c=0;c&lt;h;c++<span style="color: rgba(0, 0, 0, 1)">){
   imageData.data[(r</span>*w+c)*4+2 ] = 0 <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把蓝色设置成0</span>
   imageData.data[(r*w+c)*4+1] = 0 <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把蓝色设置成0</span>
<span style="color: rgba(0, 0, 0, 1)">}
}
ctx.putImageData(imageData,</span>0,0<span style="color: rgba(0, 0, 0, 1)">)
}
</span>&lt;/script&gt;</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/web-learn/p/15099949.html
頁: [1]
查看完整版本: HTML5(六)——Canvas 高级操作