百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Canvas绘图之平移translate、旋转rotate、缩放scale

itomcoil 2025-01-05 18:06 12 浏览

画布操作介绍

画布绘图的环境通过translate,scale,rotate, setTransform和transform来改变,它们会对画布的变换矩阵产生影响。

函数方法描述
translatedx,dx转换的量的 X 和 Y 大小
scalesx,sy水平和垂直的缩放因子
rotateangle旋转的量,用弧度表示。正值表示顺时针方向旋转,负值表示逆时针方向旋转。
setTransforma,b,c,d,e,f水平缩放,水平倾斜(与旋转有关),垂直倾斜(与旋转有关,-水平倾斜),垂直缩放,水平移动,垂直移动
transforma,b,c,d,e,f水平缩放,水平倾斜,垂直倾斜,垂直缩放,水平移动,垂直移动

translate 方法为画布的变换矩阵添加水平的和垂直的偏移。参数 dxdy添加给后续定义路径中的所有点。

scale 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx值,会导致 X 坐标沿 Y 轴对折,而指定一个负的sy会导致 Y 坐标沿着 X 轴对折。

rotate 方法通过指定一个角度,改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射,使得任意后续绘图在画布中都显示为旋转的。它并没有旋转 <Canvas> 元素本身。注意,这个角度是用弧度指定的。

setTransform 会将当前的变换矩阵重置为单位矩阵,然后构建新的矩阵。

transform 添加一个新的变换矩阵,再次绘制矩形,调用 transform 时,它都会在前一个变换矩阵上构建。

具体使用范例

我们在画布上绘制一个矩形。

 1 <!DOCTYPE html>
 2 <html>
 3 <body>
 4 
 5 <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
 6 Your browser does not support the HTML5 canvas tag.
 7 </canvas>
 8 
 9 <script>
10 
11 var c=document.getElementById("myCanvas");
12 var ctx=c.getContext("2d");
13 
14 ctx.fillStyle="yellow";
15 ctx.fillRect(0,0,250,100)
16 
17 </script>
18 
19 </body>
20 </html>

然后画出的图形如下图所示:绘制范围就是从坐标(0,0)开始画一个宽高分别为250,100的矩形。

下面对这个矩形进行平移,缩放,旋转等操作。

1 平移

如果往中间平移的话,我们可以改变它的坐标值例如ctx.fillRect(25,25,250,100),就将矩形起始位置移动到了(25,25)。绘制出的效果如下图:

另外还有一种方法,我们可以通过context的translate方法移动画布,来达到同样的视觉效果。未变换前画布的原点在左上角,使用translate方法后相当于整个坐标系在平移。

注:在操作画布变换矩阵时,最好在变换前使用save方法保存记录画布当前状态,完成绘制后可以使用restore方法恢复变换前的矩阵状态。

1 ctx.save;
2 ctx.translate(25,25);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(0,0,250,100)
5 ctx.restore;

2 缩放

缩放矩形当然可以通过调整宽高的方式这里不再举例说明。

这里主要介绍通过context的scale方法缩放画布的方法,通过以下代码就可以将黄色矩形所缩小到原来的一半(如下图)。

1 ctx.save;
2 ctx.scale(0.5,0.5);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(25,25,250,100);
5 ctx.restore;

3 旋转

旋转图中矩形,就需要把画布矩阵状态通过rotate方法变换下了。rotate(Math.PI/6)就是将画布顺时针旋转30度,画出的矩形如下图。

1 ctx.save;
2 ctx.rotate(Math.PI/6);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(25,25,250,100)
5 ctx.restore;

4 确定中心点

通过图可以看出上面的缩放和旋转都是以画布左上角为中心进行的,如果我们需要以画布中心点为中心进行变换,需要在rotate和scale方法调用前去修正画布的坐标原点位置到画布占位的中心位置ranslate(width/2,height/2),然后进行缩放变换,之后再用ranslate(-width/2,-height/2)修正坐标系。如下代码:

1 ctx.save;
2 ctx.translate(width/2,height/2);//将画布坐标系原点移至中心
3 ctx.rotate(0.5,0.5);//如果是缩放,这里是缩放代码
4 ctx.translate(-width/2,-height/2);//修正画布坐标系
5 ctx.fillStyle="yellow";
6 ctx.fillRect(25,25,250,100)
7 ctx.restore;

效果如下图:

5 设置矩阵

方法setTransform的六个参数上面已经提到,其实可以理解为缩放、旋转、移动的复合方法。当您调用 setTransform 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面。

 1 var c=document.getElementById("myCanvas");
 2 var ctx=c.getContext("2d");
 3 
 4 ctx.fillStyle="yellow";
 5 ctx.fillRect(0,0,250,100)
 6 
 7 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);//两个1代表画布进行缩放,Math.PI/6表示顺时针旋转30度,(30,10)表示平移
 8 ctx.fillStyle="red";
 9 ctx.fillRect(0,0,250,100);
10 
11 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);
12 ctx.fillStyle="blue";
13 ctx.fillRect(0,0,250,100);

和setTransform类似的还有一个方法transform,它们都有六个参数。但是不同的是每次调用 transform 时,它都会在前一个变换矩阵上构建。如下代码中先绘制的红色矩形和上图的位置是一致的,画完红色矩形后,再次调用transform(1,Math.PI/6,-Math.PI/6,1,30,10)改变画布,这次变换是在当前画布状态上变换的所以画的蓝色矩形不会和红色的重叠。如下图看上去,红色和黄色的相对位置 与 蓝色和红色的相对位置 是一样的。

 1 var c=document.getElementById("myCanvas");
 2 var ctx=c.getContext("2d");
 3 
 4 ctx.fillStyle="yellow";
 5 ctx.fillRect(0,0,250,100)
 6 
 7 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
 8 ctx.fillStyle="red";
 9 ctx.fillRect(0,0,250,100);
10 
11 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
12 ctx.fillStyle="blue";
13 ctx.fillRect(0,0,250,100);

对canvas绘图感兴趣的,还可以参看此博文http://www.cnblogs.com/fangsmile/p/5644611.html

相关推荐

tesseract-ocr 实现图片识别功能

最近因为项目需要,接触了一下关于图像识别的相关内容,例如Tesseract。具体如何安装、设置在此不再赘述。根据项目要求,我们需要从省平台获取实时雨水情况数据,原以为获取这样的公开数据比较简单,上去一...

跨平台Windows和Linux(银河麒麟)操作系统OCR识别应用

1运行效果在银河麒麟桌面操作系统V10(SP1)上运行OCR识别效果如下图:2在Linux上安装TesseractOCR引擎2.1下载tesseract-ocr和leptonicahttps:...

JAVA程序员自救之路——SpringAI文档解析tika

ApacheTika起源于2007年3月,最初是ApacheLucene项目的子项目,于2010年5月成为Apache组织的顶级项目。它利用现有的解析类库,能够侦测和提取多种不同格式文档中的元数据...

Python印刷体文字识别教程

在Python中实现印刷体文字识别(OCR),通常使用TesseractOCR引擎结合Python库。以下是详细步骤和示例:1.安装依赖库bashpipinstallpytesseractp...

图片转文字--四种OCR工具的安装和使用

本文仅测试简单的安装和使用,下一步应该是测试不同数据集下的检测准确率和检测效率,敬请期待。作者的系统环境是:笔记本:ThindPadP520OS:win11显卡:QuadroP520一、EasyO...

mac 安装tesseract、pytesseract以及简单使用

一.tesseract-OCR的介绍1.tesseract-OCR是一个开源的OCR引擎,能识别100多种语言,专门用于对图片文字进行识别,并获取文本。但是它的缺点是对手写的识别能力比较差。2.用te...

【Python深度学习系列】Win10下CUDA+cuDNN+Tensorflow安装与配置

这是我的第292篇原创文章。一、前置知识安装GPU版本的pytorch和tensorflow之前需要理清楚这几个关系:显卡(电脑进行数模信号转换的设备,有的电脑可能是双显卡,一个是inter的集成显卡...

手把手教你本地部署AI绘图Stable Diffusion!成功率100%!

导语:无需每月付费订阅,无需高性能服务器!只需一台普通电脑,即可免费部署爆火的AI绘图工具StableDiffusion。本文提供“极速安装包”和“手动配置”双方案,从环境搭建到模型调试,手把手教你...

本地AI Agent Hello World(Python版): Ollama + LangChain 快速上手指南

概要本文将用最简洁的Python示例(后续还会推出Java版本),带你逐步完成本地大模型Agent的“HelloWorld”:1、介绍核心工具组件:Ollama、LangChain和...

python解释器管理工具pyenv使用说明

简介pyenv可以对python解释器进行管理,可以安装不同版本的python,管理,切换不同版本很方便,配置安装上比anaconda方便。pyenv主要用来对Python解释器进行管理,可以...

Deepseek实战:企业别只会用Ollama,也可以用SGLang

SGLang:企业级的“性能之王”优点吞吐量碾压级优势通过零开销批处理调度器、缓存感知负载均衡器等核心技术,SGLang的吞吐量提升显著。例如,在处理共享前缀的批量请求时,其吞吐量可达158,59...

用LLaMA-Factory对Deepseek大模型进行微调-安装篇

前面的文章已经把知识库搭建好了,还通过代码的形式做完了RAG的实验。接下来呢,咱们要通过实际操作来完成Deepseek的另一种优化办法——微调。一、环境因为我这台电脑性能不太好,所以就在Au...

碎片时间学Python-03包管理器

一、pip(Python官方包管理器)1.基础命令操作命令安装包pipinstallpackage安装特定版本pipinstallnumpy==1.24.0升级包pipinstall-...

ubuntu22/24中利用国内源部署大模型(如何快速安装必备软件)

本地AI部署的基础环境,一般会用到docker,dockercompose,python环境,如果直接从官网下载,速度比较慢。特意记录一下ubuntu使用国内源快速来搭建基础平台。一,docke...

还不会deepseek部署到本地?这篇教程手把手教会你

一、为什么要把DeepSeek部署到本地?新手必看的前置知识近期很多读者在后台询问AI工具本地部署的问题,今天以国产优质模型DeepSeek为例,手把手教你实现本地化部署。本地部署有三大优势:数据隐私...