1、  如何根据鼠标位置获取canvas上对应位置的x,y。

2、  canvas的图糊了,设置宽和高的方式不对。

3、鼠标绘图代码

之前听说过canvas这个元素,但是实际上并没有深入了解过。不过日前有个项目一是使用canvas显示dicom格式的医疗影像,一是利用canvas元素生成图像压缩包,将之前对canvas隐隐约约的好奇心被无限放大,那就尝试做一个用鼠标绘制图像的画布吧。这不难,网上一搜都是教程,然而……很多事情好像并不像想象的美好。

要做的很简单,mousedown的时候设置开始作画的标签,开始作画后就开始捕捉mousemove的轨迹来作画,mouseup的时候停止(后面附完整代码)。

1、  如何根据鼠标位置获取canvas上对应位置的x,y

然而,无论使用offsetX,offsetY还是clientX-canvas.width,clientY-canvas.height都获取不到对应的x,y,我甚至找不到鼠标落下的点和鼠标位置的任何关系。我知道这应该跟canvas的拉伸有关,之前就有遇到过需要调整canvas大小后图像出问题的问题,然而网上很多代码都是直接使用这两个值,都是大忽悠,但是我对canvas没有一点了解,完全不知道如何转换,幸亏后来找到合适的方法。

                            var c=document.getElementById("myCanvas");

                             var ctx=c.getContext("2d");

                             //********尝试获得对应位置的x,y

                             c.addEventListener('click',function(event){

                                       var event = event||window.event;

                                       var bbox = c.getBoundingClientRect();

                                       var x = event.offsetX * (c.width / bbox.width);

                                       var y = event.offsetY * (c.height / bbox.height); 

                       ctx.beginPath();

                                       ctx.arc(x,y,10,0,2*Math.PI);

                                       ctx.stroke();

                             });            

2、  图糊了,如何设置宽和高。

一开始我是把canvas当作普通元素处理,那么设置宽和高不就是,:

#myCanvas{
width:800px;
  height:600px;
}

然后图糊了,下图不太明显,但是在网页中的确不能看。

然后我就知道了canvas要设置的是像素值,不是简单的宽和高,设置方法有下面两种:

<1>行内设置属性

<canvas id="myCanvas" width="800" height="500"></canvas>

<2>js设置属性

var c=document.getElementById("myCanvas");

var ctx=c.getContext("2d");

c.width=800;

c.height=600;

3、鼠标绘图代码

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8"/>
<script src='js/jquery-3.3.1.min.js'></script>
<style>
body{
background:black;
text-align:center;
}
#myCanvas{
margin:10px auto;
background:white;
} </style>
</head>
<body>
<canvas id="myCanvas"></canvas> <script type="text/javascript">
$(document).ready(function(){
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
c.width=800;
c.height=600; var tempx = -1, tempy = -1;
function painting(event){
var event = event||window.event; /*获取宽和高*/
var bbox = c.getBoundingClientRect();
var x = event.offsetX * (c.width / bbox.width);
var y = event.offsetY * (c.height / bbox.height); /*画线*/
ctx.beginPath();
ctx.moveTo(tempx, tempy);
ctx.lineTo(x, y);
ctx.stroke();
ctx.closePath();
/*存值*/
tempx = x;
tempy = y;
}
c.onmousedown = function(event){
var event = event||window.event;
var bbox = c.getBoundingClientRect();
/*存初值*/
tempx=event.offsetX * (c.width / bbox.width);
tempy=event.offsetY * (c.height / bbox.height);
/*开始作画*/
c.onmousemove = painting;
};
c.onmouseup = function(event){
c.onmousemove = null;
}; });
/********* **********/ </script>
</body>
</html>

还可以做:
  1、shift绘制图像直线,根据shiftKey绘制,下有实现,不过不太灵敏,不够符合理想的状态
  2、橡皮擦,和清除全部图像,使用
  context.clearRect(0, 0, canvas.width, canvas.height);
  3、画圆画矩形,拖动会更改大小,这个涉及的细节更多了
    圆形:
      ctx.beginPath();
      ctx.arc(95,50,40,0,2*Math.PI);
      ctx.stroke();
    矩形:
      ctx.fillRect(0,0,150,75);
  4、设置颜色选择、更改画笔粗细(可以使用正方形代替线,不过好像不太对劲)
      ctx.fillStyle="#FF0000";
  5、添加文字
      ctx.font="30px Arial";
      ctx.fillText("Hello World",10,50);
   6、历史画笔,返回恢复
      保存好进行过的操作
   7、保存下载图片
      下文再进行讨论
  这些事件要考虑的细节问题太多,就懒得写代码调整尝试了,下面是添加了shift操作并做了一些优化的代码

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8"/>
<script src='js/jquery-3.3.1.min.js'></script>
<style>
body{
background:black;
text-align:center;
}
#myCanvas{
margin:10px auto;
background:white;
} </style>
</head>
<body>
<canvas id="myCanvas"></canvas> <script type="text/javascript">
$(document).ready(function(){
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
c.width=800;
c.height=600; var tempx = -1, tempy = -1;
var shiftline=-1.0,shiftx=-1,shifty=-1;/*shift画直线,因为x,y太快捕捉不到角度,另起一个shiftx,shifty来储存*/
//*******用鼠标画线
function paintingLine(event){
var event = event||window.event; //*******获取宽和高
var bbox = c.getBoundingClientRect();
var x = event.offsetX * (c.width / bbox.width);
var y = event.offsetY * (c.height / bbox.height);
//********shift
var shiftKey = event.shiftKey;
if(shiftKey==true){
if(shiftline==-1.0){
if(shiftx==-1){
shiftx = tempx;
shifty = tempy;
}
if(timer==3){
if(x-shiftx==0){
shiftline = -2.0;
}
else{
shiftline = (y-shifty)*1.0/(x-shiftx);
} }
timer = timer+1; }
else{
if(shiftline==-2.0){
x = 0;
}
else{
y = shifty+(x-shiftx) * shiftline;
}
} }
else{
shiftline = -1.0;
shiftx = -1;
shifty = -1;
timer = 0;
}
//**********画线
ctx.beginPath();
ctx.moveTo(tempx, tempy);
ctx.lineTo(x, y);
ctx.stroke();
ctx.closePath();
//**********存值
tempx = x;
tempy = y;
}
//******按下鼠标开始画线
c.onmousedown = function(event){
var event = event||window.event;
var bbox = c.getBoundingClientRect();
//*********存初值
tempx=event.offsetX * (c.width / bbox.width);
tempy=event.offsetY * (c.height / bbox.height);
//*******开始作画
c.onmousemove = paintingLine;
};
//**********松开鼠标键停止作画
c.onmouseup = function(event){
c.onmousemove = null;
shiftline = -1.0;
shiftx = -1;
shifty = -1;
timer = 0;
};
//**********离开界面停止作画
c.onmouseout = function(event){
c.onmousemove = null;
shiftline = -1.0;
shiftx = -1;
shifty = -1;
timer = 0;
}; });
/*********
还可以做:
1、shift绘制图像直线,根据shiftKey绘制,上面有实现,不过不太灵敏,不够符合理想的状态
2、橡皮擦,和清除全部图像,使用
context.clearRect(0, 0, canvas.width, canvas.height);
3、画圆画矩形,拖动会更改大小,这个涉及的细节更多了
圆形:
ctx.beginPath();
ctx.arc(95,50,40,0,2*Math.PI);
ctx.stroke();
矩形:
ctx.fillRect(0,0,150,75);
4、设置颜色选择、更改画笔粗细(可以使用正方形代替线,不过好像不太对劲)
ctx.fillStyle="#FF0000";
5、添加文字
ctx.font="30px Arial";
ctx.fillText("Hello World",10,50);
6、历史画笔,返回恢复
保存好进行过的操作
7、保存下载图片
下文再进行讨论
这些事件要考虑的细节问题太多,就懒得写代码调整尝试了
**********/ </script>
</body>
</html>

前端鼠标绘图代码

参考:

获取鼠标位置和canvas的对应xy:https://blog.csdn.net/u010513756/article/details/47363743

有关Canvas的一点小事--鼠标绘图的更多相关文章

  1. 有关Canvas的一点小事—图像绘制

    1.  使用canvas绘制图像 什么是图像?在js中它就是一个<img src=””>,<img>有两种接收图像信息的方法,一个是直接链接到图像地址,一个使用base64数据 ...

  2. 有关Canvas的一点小事—canvas和resize

     之前就说了canvas设置大小的时候用的就是设置实打实的像素值,像图像一样设置百分比然后根据浏览器大小自己适应大小是不可能的——当然一般也不会想要cavans改变大小.不过项目之前有用到过,既然去了 ...

  3. 有关Canvas的一点小事—canvas数据和像素点

    1.  canvas生成base64数据 canvas.toDataURL()生成的数据可以直接给image对象使用作为<img>显示在前端,也可以传给后台生成图片保存.前端生成保存图片的 ...

  4. 【CITE】利用鼠标绘图C#

    实例018 利用鼠标绘图 光盘位置:光盘\MR\01\018 在常用的画图软件中,用户一般都可以通过鼠标在其中绘图,那么该功能是如何实现的呢?本实例将讲解如何使用C#实现通过拖动鼠标在窗体上绘图的功能 ...

  5. C语言实现鼠标绘图

    使用C语言+EGE图形库(Easy Graphics Engine).思路是通过不断绘制直线来实现鼠标绘图的功能,前一个时刻鼠标的坐标作为直线的起点,现在时刻的坐标作为终点(严格意义是线段而不是直线) ...

  6. 61.H5---利用canvas+原生js进行鼠标跟随绘图

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  8. 原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 演示地址:查看演示DEMO 新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:htt ...

  9. html5 canvas常用api总结(二)--绘图API

    canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...

随机推荐

  1. Python环境搭建—安利Python小白的Python安装详细教程

    人生苦短,我用Python.众所周知,Python目前越来越火,学习Python的小伙伴也越来越多.最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了 ...

  2. BZOJ4320 homework

    Description:给定\(n\)个操作,向集合中加入一个数(保证每个数不同)或者查询集合内\(\text{%Y}\)的最小值 Solution:对于小于\(\sqrt{300000}\)的直接暴 ...

  3. Conservative GC (Part one)

    目录 保守式GC 不明确的根 指针和非指针的区别 貌似指针的非指针 不明确数据结构 优点 准确式GC 正确的根 打标签 不把寄存器和栈等当做根 优点 缺点 间接引用 经由句柄引用对象 优缺点 保守式G ...

  4. 洛谷 P1914 小书童——密码

    P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...

  5. ThinkPHP数据分页Page.class.php

    获取分页类 ThinkPHP提供了数据分页的扩展类库Page,能够在http://www.thinkphp.cn/extend/241.html下载,或者下载官方的完整扩展包(http://www.t ...

  6. LintCode 二叉树的遍历 (非递归)

    前序: class Solution { public: /** * @param root: The root of binary tree. * @return: Preorder in vect ...

  7. 用c#编写爬虫在marinetraffic下载船仅仅图片

    近期在做船仅仅识别方面的事情,须要大量的正样本来训练adaboost分类器. 于是到marinetraffic这个站点上下载船仅仅图片.写个爬虫来自己主动下载显然非常方便. 站点特点 在介绍爬虫之前首 ...

  8. php 图片局部打马赛克

    php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,添加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起.就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...

  9. 想学android进来看看吧~ ~

    我深知学校里面有非常多同学想学习新的知识,而苦于没有指导. 事实上我想说的是,非常多东西须要靠自己,须要借助度娘,谷歌的.当然有人指导是最好的了. 对于刚接触android是不是也想做出像以下的效果: ...

  10. 手动连接数据库(jdbc)

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...