HTML新特性【缩放图像、图像切片、平移、旋转、缩放、变形、裁切路径、时钟、运动的小球】(二)-全面详解(学习总结---从入门到深化)

目录

绘制图像_缩放图像

绘制图像_图像切片

Canvas状态的保存和恢复

图形变形_平移

图形变形_旋转

图形变形_缩放

图形变形_变形

裁切路径

动画_时钟

动画_运动的小球

引入外部SVG


绘制图像_缩放图像

ctx.drawImage(img, x, y, width, height)
        img :图像数据,可以是 <img> 元素,也可以是 <canvas> 元素
        x :在目标 canvas 里放置图像的左上角的横坐标
        y :在目标 canvas 里放置图像的左上角的纵坐标
        width :图像在画布上的宽度
        height :图像在画布上的高度
 

       function draw(imgUrl, x, y) {
            // 定义img
            var img = new Image()
            img.src = imgUrl
            // 图片加载完后绘制图像
            img.onload = function () {
                // 绘制图像
                ctx.drawImage(img, x, y, 200, 200)
           }
       }
        // 通过遍历绘制九张图片铺满画布
        for (var i = 0; i < 3; i++) {
            for (var j = 0; j < 3; j++) {
                draw('./assets/4.jpg', i * 200, j * 200)
           }
       }

绘制图像_图像切片

 ctx.drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
        img :图像数据,可以是 <img> 元素,也可以是 <canvas> 元素·
        sx :图像源被切的开始位置的横坐标
        sy :图像源被切的开始位置的纵坐标 

        sWidth :图像源被切的宽度
        sHeight :图像源被切的高度
        dx :图像在画布的开始位置的横坐标
        dy :图像在画布的开始位置的纵坐标
        dWidth :图像在画布的宽度
        dHeight :图像在画布的高度

第一个参数和其它的是相同的,都是一个图像或者另一个 canvas 的引用。
剩余的8个参数前4个是定义图像源的切片位置和大小,后4个则是定义切片的目标显示位置和大小。

        //   定义图片
        var img = new Image()
        img.src = './assets/2.jpg'
        // 图片加载完成后绘制图像
        img.onload = function () {
            // 绘制图像
            // 从源图片(50,50)的位置开始切片,切片大小为50*50
            //切片在画布上的起始位置为(100,100),切片在画布上最终画出 //来的大小为200*200
            ctx.drawImage(img, 50, 50, 50,50, 100, 100, 200, 200)
       }
         //绘制矩形
        ctx.lineWidth = 30
        ctx.strokeStyle = 'yellow'
        ctx.strokeRect(100, 100, 200, 200)

Canvas状态的保存和恢复

1、 ctx.save() :将画布的当前状态保存起来,相当于在内存之中产生一个样式快照
一个绘画状态包括:
        1.1、当前的一些样式: strokeStyle , fillStyle , lineWidth , lineCap , lineJoin ,lineDashOffset ,         shadowOffsetX , shadowOffsetY , shadowBlur , shadowColor , 
        font , textAlign , textBaseline

        1.2、当前应用的变形(即移动,旋转和缩放)
       1.3、当前的裁切路径(clipping path)
2、ctx.restore() :将画布的样式恢复到之前保存的快照

        ctx.fillRect(0, 0, 300, 300)//绘制矩形
        ctx.save()//保存当前状态
        ctx.fillStyle = 'green'//设置填充色
        ctx.fillRect(30, 30, 240,240)//绘制矩形
        ctx.save()//保存当前状态
        ctx.fillStyle='#fff'//设置填充色
        ctx.fillRect(60,60,180,180)//绘制矩形
        ctx.restore()//恢复上一个状态
        ctx.fillRect(90,90,120,120)
        ctx.restore()//恢复上上一个状态
        ctx.fillRect(120,120,60,60)

图形变形_平移

 ctx.translate(x, y)
x :是左右偏移量, x>0 ,向右平移, x<0 ,向左平移
y :是上下偏移量, y>0 ,向下平移, y<0 ,向上平移

     for (var i = 0; i < 2; i++) {
            for (var j = 0; j < 2; j++) {
                ctx.restore()//恢复上一次状态
                ctx.save()//保存上一次状态
                //产生平移
                ctx.translate(50 * i + 10, 50 * j + 10)
                //设置填充颜色
                ctx.fillStyle = ['red', 'green'][j]
                //绘制小矩形
                ctx.fillRect(0, 0, 25, 25)
           }
       }

图形变形_旋转

 ctx.rotate(angle) :以 原点为中心 旋转 坐标系
        angle :旋转的角度(angle),它是顺时针方向的,以弧度为单位的值。

        // 平移
        ctx.translate(100, 100)
        for (var i = 1; i < 7; i++) {
            // 旋转坐标系
            ctx.rotate((Math.PI*2)/6)
            // 绘制圆形
            ctx.beginPath()
            ctx.fillStyle = 'red'
            ctx.arc(0, 30, 5, 0, Math.PI * 2)
            ctx.fill()
       }

图形变形_缩放

 ctx.scale(x,y) :用于缩放图像。
        x x 轴方向的缩放因子
        y y 轴方向的缩放因子
默认情况下,一个单位就是一个像素,缩放因子可以缩放单位,比如缩放因子 0.5 表示将大小缩小为原来的50%,缩放因子 10 表示放大十倍。
如果缩放因子为1,就表示图像没有任何缩放。
如果为-1,则表示方向翻转。 ctx.scale(-1, 1) 为水平翻转, ctx.scale(1, -1) 表示垂直翻转。

        ctx.translate(100, 100)//平移
        ctx.save()//保存当前状态
        // 绘制第一个矩形
        ctx.fillStyle = 'green'
        ctx.fillRect(0, 20, 100, 100)
        //绘制X轴所在的一条直线
        ctx.beginPath()
        ctx.moveTo(0,0)
        ctx.lineTo(500,0)
        ctx.stroke()
        
        // 绘制第二个矩形
        ctx.scale(0.5, 0.5)//缩放网格
        ctx.fillStyle = 'yellow'
        ctx.fillRect(0, 40, 100, 100)
        
        ctx.restore()//恢复之前的状态
        ctx.scale(1, -1)//垂直方向翻转
        // 绘制第一个矩形
        ctx.fillStyle = 'green'
        ctx.fillRect(0, 20, 100, 100)
        // 绘制第二个矩形
        ctx.scale(0.5, 0.5)//缩放网格
        ctx.fillStyle = 'yellow'
        ctx.fillRect(0, 40, 100, 100)

图形变形_变形

1、 ctx.transform(a, b, c, d, e, f) :接受变换矩阵的六个元素作为参数,完成缩放、平移和倾斜等变形。
        a :x轴方向缩放
        b :x轴方向倾斜
        c :y轴方向倾斜
        d :y轴方向缩放
        e :x轴方向平移
        f :y轴方向平移
2、默认状态: transform(1,0,0,1,0,0)

 变换矩阵: a c e
                  [ b d f ]
                  0 0 1

 点 (x,y) 经过矩阵变换后得到 (x',y')

 1 、x' = ax + cy + e;
 2 、y' = bx + dy + f;

ctx.setTransform(a, b, c, d, e, f) :重置并创建新的变换矩阵
ctx.resetTransform() :重置当前变形为单位矩阵,它和调用以下语句是一样的:
ctx.setTransform(1, 0, 0, 1, 0, 0);
 

        ctx.fillRect(0, 0, 100, 100);//绘制参考矩形
        ctx.fillStyle='green'
        // ctx1.transform(0.5, 0, 0, 0.5, 0, 0);//缩放
        // ctx1.transform(1, 0, 0, 1, 50, 50);//平移
        // ctx1.transform(1, 1, 0, 1, 0, 0);//倾斜
        ctx.transform(0.5, 1, 0, 0.5, 50, 50);//综合变形
        ctx.fillRect(0, 100, 100, 100);//绘制变形后的矩形
        ctx.setTransform(0.5, 0, 0, 0.5, 0, 0);//重置并创建新的变化矩阵
        ctx.fillRect(0, 400, 100, 100);//绘制重置并创建新变形后的矩形

裁切路径

 ctx.clip() :将构建的路径转换为裁剪路径,裁切路径确定好之后,再绘制图形,裁切路径内的图形可以显示,裁切路径外的图形不显示。
默认情况下,canvas 有一个与它自身一样大的裁切路径(也就是没有裁切效果)。

 提示:
裁切路径也属于canvas状态

        var ctx = document.getElementById('canvas').getContext('2d')
        ctx.save()//保存状态
        ctx.fillRect(0, 0, 200, 200)//绘制一个跟画布一样大小的黑色矩形
        ctx.arc(100, 100, 50, 0, 2 * Math.PI)//定义个圆形的路径
        ctx.clip()
        // ctx.restore()
        // 绘制一个跟画布一样大小的黄色矩形
        ctx.fillStyle = 'yellow'
        ctx.fillRect(0, 0, 200, 200)

动画_时钟

    <canvas width="150" height="150" id="canvas"></canvas>
    <script>
        var ctx = document.getElementById('canvas').getContext('2d')
        ctx.translate(75, 75)//移动原点到画布的正中心
        ctx.rotate(-Math.PI / 2)//逆时针旋转九十度
        ctx.lineCap = 'round'//设置线条末端样式
        ctx.save()
        clock()
        function clock() {
            ctx.clearRect(-75, -75, 150, 150)
            //   绘制一个跟画布一样大小的粉色矩形
            ctx.fillStyle = 'pink'
            ctx.fillRect(-75, -75, 150, 150)
            // 获取当前时间
            var now = new Date()
            // 绘制小时的刻度
            ctx.lineWidth = 3//设置线条宽度
            for (var i = 0; i < 12; i++) {
                ctx.beginPath()
                ctx.rotate(Math.PI / 6)
                ctx.moveTo(68, 0)
                ctx.lineTo(75, 0)
                ctx.stroke()
           }
            // 绘制分钟的刻度
            ctx.lineWidth = 2//设置线条宽度
            for (var i = 0; i < 60; i++) {
                // 如果i除以五的余数不为0,则代表不跟小时的刻度重合,则绘制分钟的刻度
                if (i % 5 != 0) {
                    ctx.beginPath()
                    ctx.moveTo(72, 0)
                    ctx.lineTo(75, 0)
                    ctx.stroke()
               }
                ctx.rotate(Math.PI / 30)
           }

           var hour = now.getHours()
            var min = now.getMinutes()
            var sec = now.getSeconds()
            hour = hour > 12 ? hour - 12 : hour
            console.log(hour)
            console.log(min)
            console.log(sec)
            // 绘制时针
            ctx.restore()
            ctx.save()
            ctx.lineWidth = 5
            ctx.rotate((Math.PI / 6) * (hour + min / 60 + sec / 3600))
            ctx.beginPath()
            ctx.moveTo(-10, 0)
            ctx.lineTo(40, 0)
            ctx.stroke()
            // 绘制分针
            ctx.restore()
            ctx.save()
            ctx.lineWidth = 4
            ctx.rotate((Math.PI / 30) * (min + sec / 60))
            ctx.beginPath()
            ctx.moveTo(-10, 0)
            ctx.lineTo(60, 0)
            ctx.stroke()

         // 绘制秒针
            ctx.restore()
            ctx.save()
            ctx.lineWidth = 3
            ctx.rotate((Math.PI / 30) * (sec))
            ctx.beginPath()
            ctx.moveTo(-10, 0)
            ctx.lineTo(60, 0)
            ctx.strokeStyle = 'red'
            ctx.stroke()
            // 在原点处绘制红色小圆点
            ctx.beginPath()
            ctx.arc(0, 0, 5, 0, 2 * Math.PI)
            ctx.fillStyle = 'red'
            ctx.fill()
            // 在秒针末端绘制小圆圈
            ctx.beginPath()
            ctx.arc(65, 0, 5, 0, 2 * Math.PI)
            ctx.stroke()
            ctx.restore()
       }
        setInterval(function () {
            clock()
        }, 1000)


动画_运动的小球

        var c = document.getElementById('canvas')
        var ctx = c.getContext('2d')
        var raf;
        var x = 250//定义小球的圆心的默认横坐标
        var y = 250//定义小球的圆形的默认纵坐标
        var stepX = 5//定义小球每次运动水平方向的偏移矢量
        var stepY = 2//定义小球每次运动垂直方向的偏移矢量
        function draw() {
            // ctx.clearRect(0, 0, 500, 500)
            // 每次绘制前都画一个带点透明的矩形,这样可以产生尾巴的效果
            ctx.fillStyle = 'rgba(255,255,255,0.3)';
            ctx.fillRect(0, 0, 500, 500);
            //根据小球的新的圆心的位置绘制小球
            ctx.beginPath()
            ctx.arc(x, y, 20, 0, 2 * Math.PI)
            ctx.fillStyle = 'red'
            ctx.fill()
            // 判断小球的位置.如果超出
            if (x + 20 >= 500 || x - 20 <= 0) {
                stepX = -stepX;
           }
            if (y + 20 >= 500 || y - 20 <= 0) {
                stepY = -stepY;
           }
            // 改变小球的位移
            x += stepX
            y -= stepY
       }
        function anim() {
            draw()//绘制小球
            //告诉浏览器我要执行一个动画,传递进去的回调函数会在每次重绘之前调用,一般情况下每秒执行60次
            raf = window.requestAnimationFrame(anim)
       }
        anim()
        // 监听鼠标的移动事件,让小球跟着鼠标移动位置
        c.addEventListener('mousemove',function (e) {
          window.cancelAnimationFrame(raf);
            x = e.offsetX;
            y = e.offsetY;
            draw()
       });
        // 点击鼠标,则继续开始动画
        c.addEventListener('click', function (e) {
            anim()
      });

引入外部SVG

 SVG :遵循 XML 标准,用来定义可缩放矢量图形。
 1、引入外部svg文件的方式
      1.1、作为元素的背景图

#con {
            width:100px;
            height: 100px;
            background: url('./test.svg') no-repeat;
       }

   1.2、使用 img 引入

<img src="test.svg" alt="" >

 1.3、使用 object 引入

<object data="test.svg" type="image/svg+xml" />

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/185974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源与闭源

我的观点&#xff1a; 开源与闭源软件都有各自的优势和劣势&#xff0c;没有绝对的对错之分。.. 一、开源和闭源的优劣势比较 开源的好处与劣处 优势&#xff1a; 创新与合作&#xff1a;开源软件能够吸引更多的开发者参与到项目中来&#xff0c;促进创新和合作。开放的源代码…

【网易云商】构建高效 SaaS 系统的技术要点与最佳实践

SaaS 是什么 定义 相信大家都对云服务中的 IaaS、PaaS、SaaS 早就有所耳闻&#xff0c;现在更是衍生出了 aPaaS、iPaaS、DaaS 等等的类似概念。对于 SaaS 也有各种各样的定义&#xff0c;本文给出的定义是&#xff1a; SaaS 是一种基于互联网提供服务和软件的交付模式&#xf…

一文彻底看懂Python切片,Python切片理解与操作

1.什么是切片 切片是Python中一种用于操作序列类型(如列表、字符串和元组)的方法。它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列。切片是访问特定范围内的元素,就是一个Area。 说个笑话:切片不是切片,而是切片,但是又是切片。大家理解下呢(末…

80C51单片机----数据传送类指令

目录 一.一般传送指令&#xff0c;即mov指令 1.16位传送&#xff08;仅1条&#xff09; 2.8位传送 &#xff08;1&#xff09;目的字节为A&#xff08;累加器&#xff09; &#xff08;2&#xff09;目的字节为Rn(工作寄存器) &#xff08;3&#xff09;目的字节为direct…

java中的String.format()方法详解

介绍 String.format() 是 Java 中的一个字符串格式化方法&#xff0c;它用于生成指定格式的字符串。这个方法可以接受一个或多个参数&#xff0c;并将它们按照指定的格式插入到字符串中。它使用了类似于 C 语言中的 printf 函数的语法。 String.format() 方法的使用格式如下&…

Tars框架 Tars-Go 学习

Tars 框架安装 网上安装教程比较多&#xff0c;官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…

微机原理_3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 在 8086 微机系统中&#xff0c;完成对指令译码操作功能的部件是&#xff08;)。 A. EU B. BIU C. SRAM D. DRAM 使计算机执行某…

【Rust日报】2023-11-22 Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器

Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器 Floneum 是一款用于 AI 工作流程的图形编辑器&#xff0c;专注于社区制作的插件、本地 AI 和安全性。 Floneum 有哪些特性&#xff1a; 可视化界面&#xff1a;您无需任何编程知识即可使用Floneum。可视化图形编辑器可…

2023年金融信创行业研究报告

第一章 行业概况 1.1 定义 金融信创是指在金融行业中应用的信息技术&#xff0c;特别是那些涉及到金融IT基础设施、基础软件、应用软件和信息安全等方面的技术和产品。这一概念源于更广泛的“信创 (信息技术应用创新)”&#xff0c;即通过中国国产信息技术替换海外信息技术&a…

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录 文章目录 系列文章目录未初始化的存储指针实战二实验目的实验环境实验工具实验原理实验内容实验过程EXP利用 未初始化的存储指针实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验…

【Vue】图片切换

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所需要的指令有&#xff1a; v-on v-bind v-show <!DOCTYPE html> <html lang"en"> <head><meta charset"…

【微服务专题】SpringBoot自动配置源码解析

目录 前言阅读对象阅读导航前置知识笔记正文0、什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】 一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注解2.…

基于 STM32Cube.AI 的嵌入式人脸识别算法实现

本文介绍了如何使用 STM32Cube.AI 工具开发嵌入式人脸识别算法。首先&#xff0c;我们将简要介绍 STM32Cube.AI 工具和 STM32F系列单片机的特点。接下来&#xff0c;我们将详细讨论如何使用 STM32Cube.AI 工具链和相关库来进行人脸识别算法的开发和优化。最后&#xff0c;我们提…

仿 美图 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 效果图一&#xff1a;左右RecyclerView 联动 效果图二&#xff1a;通过点击 向上偏移至最大值 效果图三&#xff1a;通过点击 或 拖动 展开收缩公告 效果图四&…

2021年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列程序,屏幕上可以看到几只小猫? A:1 B:3 C:4 D:0 答案:B 第2题 下列程序哪个可以实现:按下空格键,播放完音乐后说“你好!”2秒? A: B: C:

知虾官网:探索跨境电商数据的新平台

随着电子商务的快速发展&#xff0c;跨境电商已成为全球贸易的重要组成部分。为了帮助企业更好地了解市场、选品、分析竞争对手和科学运营&#xff0c;知虾官网应运而生。本文将为您介绍知虾官网的功能和优势&#xff0c;以及广州萌啦信息科技有限公司的背景。 一、知虾官网的功…

Python中classmethod的妙用

更多Python学习内容&#xff1a;ipengtao.com 在Python中&#xff0c;classmethod装饰器为开发者提供了一种强大的工具&#xff0c;使得类方法的定义和使用更加灵活。本文将深入探讨classmethod的妙用&#xff0c;通过丰富的示例代码展示其在不同场景下的实际应用。 类方法与实…

【JavaWeb】TomcatJavaWebHTTP

Tomcat&JavaWeb&HTTP 文章目录 Tomcat&JavaWeb&HTTP一、Tomcat1.1 版本选择及安装1.2 目录1.3 WEB项目部署的方式 二、IDEA中Java Web开发部署流程三、HTTP协议3.1 发展历程3.2 HTTP协议的会话方式3.3 请求报文3.4 响应报文 一、Tomcat Tomcat是Apache 软件基…

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…

【CVE-2021-1675】Spoolsv打印机服务任意DLL加载漏洞分析

漏洞详情 简介 打印机服务提供了添加打印机的接口&#xff0c;该接口缺乏安全性校验&#xff0c;导致攻击者可以伪造打印机信息&#xff0c;在添加新的打印机时实现加载恶意DLL。这造成的后果就是以system权限执行任意代码。 影响版本 windows_10 20h2 windows_10 21h1 win…