Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Canvas网页涂鸦板再次增强版

Canvas网页涂鸦板再次增强版

作者头像
不愿意做鱼的小鲸鱼
发布于 2022-09-24 01:41:56
发布于 2022-09-24 01:41:56
1.3K00
代码可运行
举报
文章被收录于专栏:web全栈web全栈
运行总次数:0
代码可运行

第一版Canvas涂鸦板

  • 实现功能:在涂鸦板上鼠标按下去拖动的涂鸦效果
  • 实现思路:监听鼠标按下、移动、松开事件,将鼠标按下的值赋值给moveTo的x和y值,作为起始位置。在移动事件中,将鼠标距离可视区x和y值赋给lineTo,再进行描边。
  • 实现代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Canvas案例-网页涂鸦板</title>
    </head>
<body>
    <!--<center></center>表示将标签内所有的内容居中-->
    <center>
       <canvas id="cavsElem">
        你的浏览器不支持canvas,请升级浏览器
       </canvas>
    </center>
    <script>
        (function(){
            //获得画布
            var canvas = document.getElementById('cavsElem');
            //准备画笔(获取上下文对象)
            var context = canvas.getContext('2d');
            //设置标签的宽高和边框
            canvas.width = 900;
            canvas.height = 600;
            canvas.style.border = "1px solid #000";
            //当鼠标按下触发onmousedown事件时,定义一个函数获取鼠标起始坐标
            canvas.onmousedown = function(e) {
                var x = e.clientX - canvas.getBoundingClientRect().left;
                var y = e.clientY - canvas.getBoundingClientRect().top;
                context.beginPath();//开始规划路径
                context.moveTo(x, y);//移动起始点
                //当鼠标移动触发onmousemove事件时,定义一个函数获取绘制线条的坐标
                canvas.onmousemove = function(event) {
                    var x = event.clientX- canvas.getBoundingClientRect().left;
                    var y = event.clientY- canvas.getBoundingClientRect().top;
                    // canvas.clearRect(0, 0, 900, 600);
                    context.lineTo(x, y);//绘制线条
                    context.stroke();//绘制描边
                };
                //当鼠标按键被松开时,onmousemovet函数返回null
                canvas.onmouseup = function(event) {
                    canvas.onmousemove = null;
                };
            };
        }());
    </script>
</body>
</html>
  • 实现效果

第二版Canvas涂鸦板

  • 实现功能:
    1. 可以根据颜色板选择涂鸦笔的颜色
    2. 可以选择画笔的粗细
    3. 可以对涂鸦板清屏
  • 实现思路:
    1. 颜色板用Html5的 <input type="color">,可以根据该input对象的value值获取选择的颜色码
    2. 画笔的粗细用了Html5的<input type="number">,来选择数字,然后将获取的数字值赋给画笔context.lineWidth = x; //设置线的粗细
    3. 涂鸦板清屏可以使用canvas自带的clearRect属性 context.clearRect(0, 0, canvas.width, canvas.height); //清除矩形
  • 实现代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<code class="language-clike line-numbers"><!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Canvas案例-网页涂鸦板</title>
</head>

<body>
    <!--<center></center>表示将标签内所有的内容居中-->
    <center>
        <canvas id="cavsElem">
            你的浏览器不支持canvas,请升级浏览器
        </canvas><br>
        选择画笔颜色:<input type="color" value="#ff0000" id="mycolor" onchange=colorChange() />   
        <input type="button" value="清除" id="clear" onclick=clearAll()>    
        选择画笔粗细:<input type="number" id="gsize" value="1" min="1" onchange=sizeChange()>
    </center>
    <script>
        //获得画布
        var canvas = document.getElementById('cavsElem');
        //准备画笔(获取上下文对象)
        var context = canvas.getContext('2d');
        //设置标签的宽高和边框
        canvas.width = 900;
        canvas.height = 600;
        context.strokeStyle = document.getElementById("mycolor").value; //设置描边颜色
        canvas.style.border = "1px solid #000";
        //当鼠标按下触发onmousedown事件时,定义一个函数获取鼠标起始坐标
        canvas.onmousedown = function (e) {
            var x = e.clientX - canvas.getBoundingClientRect().left;
            var y = e.clientY - canvas.getBoundingClientRect().top;
            context.beginPath(); //开始规划路径
            context.moveTo(x, y); //移动起始点
            //当鼠标移动触发onmousemove事件时,定义一个函数获取绘制线条的坐标
            canvas.onmousemove = function (event) {
                var x = event.clientX - canvas.getBoundingClientRect().left;
                var y = event.clientY - canvas.getBoundingClientRect().top;
                // canvas.clearRect(0, 0, 900, 600);
                context.lineTo(x, y); //绘制线条
                context.stroke(); //绘制描边
            };
            //当鼠标按键被松开时,onmousemovet函数返回null
            canvas.onmouseup = function (event) {
                canvas.onmousemove = null;
            };
        };
        /* 清除画布 */
        function clearAll() {
            //清除矩形
            context.clearRect(0, 0, 900, 600);
        }
        /* 颜色选择 */
        function colorChange() {
            var mycolor = document.getElementById("mycolor");
            var x = mycolor.value;
            // console.log('x :', x);
            context.strokeStyle = x; //设置描边颜色
        }
        /* 画笔粗细 */
        function sizeChange() {
            var mycolor = document.getElementById("gsize");
            var x = mycolor.value;
            context.lineWidth = x; //设置线的粗细
        }
    </script>
</body>
</html>
  • 实现效果

第三版Canvas涂鸦板

  • 实现功能:
    1. 实现涂鸦时上一步和下一步的功能(撤回)
    2. 实现选择画布颜色的功能
    3. 实现对涂鸦的涂鸦板生成图片
  • 实现思路:
    1. 后退和前进(撤回)功能,我的想法是每画一次就将整个画布的数据push到一个数组中,按前进和后退时再将对应的数据取出来,这个可以通过getImageData和putImageData方法实现,这两个方法的使用可以到http://www.w3school.com.cn/tags/html_ref_canvas.asp中查看。
    2. 选择画布颜色功能有两种(获取颜色板的方法和第二版设置画笔颜色相同)
      • 第一种就是将颜色设置为画布的css背景颜色,但是实现生成图片的时候不会把背景颜色生成
      • 第二种就是直接在画布上画一个填充矩形,设置填充颜色,生成图片可以生成颜色
    3. 生成涂鸦图片是先将canvas画板转为base64编码,然后放在了img标签里
  • 实现代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Canvas案例-网页涂鸦板</title>
</head>

<body>
    <!--<center></center>表示将标签内所有的内容居中-->
    <center>
        <canvas id="cavsElem">
            你的浏览器不支持canvas,请升级浏览器
        </canvas><br>
        选择画布颜色:<input type="color" value="#ffffff" id="mycanvasColor"
            onchange="canvasColorChange()" />   
        选择画笔颜色:<input type="color" value="#ff0000" id="mycolor" onchange="colorChange()" />   
        <input type="button" value="清除" id="clear" onclick="clearAll()">    
        选择画笔粗细:<input type="number" id="gsize" value="1" min="1" onchange="sizeChange()">   
        <input type="button" value="上一步" onclick="prevStep()">
        <input type="button" value="下一步" onclick="nextStep()">   
        <button onClick="saveImg()">生成图片</button><br>
        <h4>下面是涂鸦生成的图片</h4>
        <img id='img' alt='请涂鸦……' />
    </center>
    <script>
        //画布数据
        var imgList = [];
        //上一步索引
        var prevIndex = 0;
        //下一步索引
        var nextIndex = 0;
        //当前索引
        var currentIndex = 0;
        //获取图片节点
        var img = document.getElementById('img');
        //获得画布
        var canvas = document.getElementById('cavsElem');
        //准备画笔(获取上下文对象)
        var context = canvas.getContext('2d');
        //设置标签的宽高和边框
        canvas.width = 900;
        canvas.height = 600;
        context.strokeStyle = document.getElementById("mycolor").value; //设置描边颜色
        canvas.style.border = "1px solid #000";
        //当鼠标按下触发onmousedown事件时,定义一个函数获取鼠标起始坐标
        canvas.onmousedown = function (e) {
            upIndex(imgList.length);
            var x = e.clientX - canvas.getBoundingClientRect().left;
            var y = e.clientY - canvas.getBoundingClientRect().top;
            context.beginPath(); //开始规划路径
            context.moveTo(x, y); //移动起始点
            //当鼠标移动触发onmousemove事件时,定义一个函数获取绘制线条的坐标
            canvas.onmousemove = function (event) {
                var x = event.clientX - canvas.getBoundingClientRect().left;
                var y = event.clientY - canvas.getBoundingClientRect().top;
                // canvas.clearRect(0, 0, 900, 600);
                context.lineTo(x, y); //绘制线条
                context.stroke(); //绘制描边
            };
            //当鼠标按键被松开时,onmousemovet函数返回null
            //注意,要用document全局监听
            canvas.onmouseup = function (event) {
                //调用保存画布数据
                pushImg();
                console.log('imgList :', imgList);
                canvas.onmousemove = null;

            };
        };


        /* 清除画布 */
        function clearAll() {
            //清除矩形
            context.clearRect(0, 0, canvas.width, canvas.height);
        }
        /* 画布颜色选择 */
        function canvasColorChange() {
            var canvasColor = document.getElementById("mycanvasColor");
            var x = canvasColor.value;
            // canvas.setAttribute('style', "background:" + x + ";z-index: -1;");   //直接设置背景颜色
            context.fillStyle = x; //设置填充颜色
            context.fillRect(0, 0, canvas.width, canvas.height);

        }
        /* 画笔颜色选择 */
        function colorChange() {
            var mycolor = document.getElementById("mycolor");
            var x = mycolor.value;
            context.strokeStyle = x; //设置描边颜色
        }
        /* 画笔粗细 */
        function sizeChange() {
            var mycolor = document.getElementById("gsize");
            var x = mycolor.value;
            context.lineWidth = x; //设置线的粗细
        }
        /* 保存画布数据 */
        function pushImg() {
            imgList.push(context.getImageData(0, 0, canvas.width, canvas.height));
        }
        /* 上一步 */
        function prevStep() {
            clearAll();
            if (prevIndex >= 0) {
                context.putImageData(imgList[prevIndex], 0, 0);
            }
            upIndex(prevIndex);

        }
        /* 下一步 */
        function nextStep() {

            console.log('nextIndex :', nextIndex);
            if (nextIndex !== imgList.length) {
                clearAll();
                context.putImageData(imgList[nextIndex], 0, 0);
            }
            upIndex(nextIndex);
        }

        /* 更新索引 */
        function upIndex(index) {
            if (index === -1) {
                prevIndex = -1;
            } else {
                prevIndex = index - 1;
            }

            if (index === imgList.length) {
                nextIndex = imgList.length;
            } else {
                nextIndex = index + 1;
            }
            currentIndex = index;
        }

        /* 生成图片 */
        function saveImg() {
            //转为base64编码
            var dataUrl = canvas.toDataURL();
            img.src = dataUrl;
        }
    </script>
</body>

</html>

实现效果

体验涂鸦板

点击这里 http://qkongtao.cn//file/graffiti.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?
ArkUI是一套UI开发框架,提供了开发者进行应用UI开发时所需具备的能力。随着OpenAtom OpenHarmony(以下简称“OpenHarmony”)不断更新迭代,ArkUI也提供了很多新的组件,例如Canvas、OffscreenCanvas、XComponent组件等。
小帅聊鸿蒙
2025/04/20
940
如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?
HTML5 Canvas的简单使用
参考这里 https://www.runoob.com/w3cnote/html5-canvas-intro.html
不愿意做鱼的小鲸鱼
2022/09/24
1.5K0
HTML5 Canvas的简单使用
利用 Canvas 实现 Valine 评论画板涂鸦
前几天在 Joe(https://ae.js.cn/)网站上留言的时候发现了一个叫“画图模式”的东西,点进去后自动切换文本框到画板了(类似QQ涂鸦,你画我猜那种画板),然后可以在画板上画画,还可以选择画笔粗细、颜色等等,画错了还能撤销各种功能,欸感觉挺有意思的,当时也猜到了应该是用 canvas 做的,不过自己也不太了解这块,但就是感觉挺有意思的,加上我又喜欢魔改 valine 评论,所以立下计划决定给评论系统加上这么一个好玩的功能。
2Broear
2024/03/12
1470
利用 Canvas 实现 Valine 评论画板涂鸦
利用canvas实现毛笔字帖(二)
2. 第2部分write.js 第二部分决定先介绍write部分,因为controller部分必须要结合write部分才能看到效果。 针对write.js部分,前面有介绍,是用来实现通过鼠标(手指)写字的核心部分。 分析一下要做的事情。
用户1394570
2018/08/08
3.6K0
利用canvas实现毛笔字帖(二)
【实战】Canvas实现图片上标注、缩放、移动和保存历史状态
面试官说可以往深层次思考一下,或许加一些新的功能来增加项目的难度,他提了几个建议,其中一个就是试卷在线批阅,老师可以在上面对作业进行批注,圈圈点点等俺当天晚上就开始研究这个东东哈哈哈,终于被我研究出来啦!
Nealyang
2020/06/10
7.1K0
【实战】Canvas实现图片上标注、缩放、移动和保存历史状态
Canvas 上实现坐标定位
我们顺便还显示了一个拖拽的功能,当然这个并不是使用 canvas 绘制,后面会讲到。
Jimmy_is_jimmy
2023/09/01
4100
Canvas 上实现坐标定位
原 canvas小案例集合(小画板、画的回
作者:汪娇娇 日期:2016.12.8 在现在这个公司呆了4个多月,也是研究了canvas将近4个月,前两周心里就痒痒的想写这方面的博客,但一直没时间。可一直拖着也不是个办法,就这样抽抽空来写吧。 c
jojo
2018/05/03
1.4K1
原                                                                                canvas小案例集合(小画板、画的回
Canvas学习系列二:Canvas的坐标系统
版权声明:本文为原创文章发布于公众号:Modeng , 你可以随意转载但请务必注明出处!!! https://blog.csdn.net/qq_32135281/article/details/73163489
六小登登
2018/09/17
6.5K0
Canvas学习系列二:Canvas的坐标系统
Canvas实现网页协同画板
画板协同: 简单来说就是使用canvas开发一个可以多人共享的画板,都可以在上面作画画板,并且画面同步显示 canvas白板相关使用参考我之前的文章:Canvas网页涂鸦板再次增强版
不愿意做鱼的小鲸鱼
2022/09/30
1.8K0
Canvas实现网页协同画板
用canvas消除锯齿的方式
这通常在图像处理库中实现,Canvas本身不直接支持,但可以通过引入外部库如fabric.js或自定义函数实现。
阿超
2024/02/23
1.6K0
因业务需要,我用canvas写了一个签名板
文章链接:https://cloud.tencent.com/developer/article/2468390
一起重学前端
2024/11/21
1040
【被玩坏的博客园】之canvas装饰博客园侧边栏
最近抽空学了学canvas,然后用canvas做了个小球运动的demo,大致的效果如下: 虽然网上已经有很多这样的demo,但是还是想根据自己的思路来写一个,下面先跟大家讲解一下源代码,先看html代
用户1749219
2018/05/16
1.5K0
通过游戏学javascript系列第一节Canvas游戏开发基础
HTML5引入了canvas元素。canvas元素为我们提供了一块空白画布。我们可以使用此画布来绘制和绘制我们想要的任何东西。JavaScript为我们提供了动态制作动画并绘制到画布上所需的工具。它不仅提供绘图和动画系统,还可以处理用户交互。在本教程中,我们将使用纯JavaScript制作基本的HTML5 Canvas框架,该框架可用于制作真实的游戏。在本教程的结尾创建了一个非常简单的游戏,以演示HTML5 Canvas与JavaScript结合的优势。
huofo
2022/03/18
8000
通过游戏学javascript系列第一节Canvas游戏开发基础
【HTML5】Canvas 实现放大镜效果
首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致
零式的天空
2022/03/02
3.3K0
H5 Canvas 旋转小伞+时钟
原生态的js, 利用H5 Canvas 写的旋转小伞+时钟 指针和表盘会变颜色哦!指针到达小伞位置,会跟四周的小伞颜色一致! H5 Canvas 旋转小伞+时钟 效果如下: JavaScript代码: <script type="text/javascript" language="javascript"> window.onload=function () { // 创建画布 var canvas=document.createElement('canvas'); var brus
AlexTao
2019/08/17
1K0
Canvas 进阶(三)ts + canvas 重写”辨色“小游戏
之前写过一篇文章 ES6 手写一个“辨色”小游戏, 感觉好玩挺不错。岂料评论区大神频出,其中有人指出,打开控制台,输入以下代码:
小皮咖
2019/11/05
1.1K0
Canvas 进阶(三)ts + canvas 重写”辨色“小游戏
canvas离屏技术与放大镜实现
利用canvas除了可以实现滤镜,还可以利用离屏技术实现放大镜功能。为了方便讲解,本文分为 2 个应用部分:
心谭博客
2020/04/20
1.3K0
Canvas 动画: atan2 三角函数与鼠标跟随效果
这个案例展示了如何使用HTML5的Canvas和JavaScript实现一个动态效果:在画布上绘制一个箭头,并让它实时跟随鼠标移动。这个小项目不仅有趣,还能帮助你理解编程和基本数学概念的实际应用。
前端达人
2024/11/25
1470
Canvas 动画: atan2 三角函数与鼠标跟随效果
Canvas
注意canvas 的 width 和 height 不要用 css 来设定,如果用 css 样式来设置,会变形和失真
小丞同学
2021/08/16
1.2K0
手写原生代码专题 | 简易手写画板(二)
如视频所示,在这个示例中,我们用到了画布 canvas 相关的知识,比如创建画布、画圆形、画直线的基础知识,有了这些基础后,我们就能轻松完成本示例,示例效果如下视频所示。
前端达人
2021/07/16
1.5K0
相关推荐
如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档