HTML5使用Canvas做一个在线画图程序(支持把画布保存为图像)

1,在线画图板的开发
(1)页面加载后,我们取得<canvas>对象,为它添加一些处理函数,以便处理不同鼠标操作导致的JavaScript事件:onmousedown、onmouseup、onmouseout、onmousemove。
(2)画布上方了两个工具栏可以选择笔画颜色和笔画粗细。点击里面的<img>元素,会调用对应绑定的方法,从而将 strokeStyle 属性设置不同的颜色,或将 lineWidth 属性设置不同的粗细。

在线Demo如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Paint</title>
  <link rel="stylesheet" href="Paint.css">
  <script>
    var canvas;
    var context;
 
    // 初始化
    window.onload = function() {
      // 获取画布已经绘图上下文
      canvas = document.getElementById("drawingCanvas");
      context = canvas.getContext("2d");
 
      // 画布添加鼠标事件
      canvas.onmousedown = startDrawing;
      canvas.onmouseup = stopDrawing;
      canvas.onmouseout = stopDrawing;
      canvas.onmousemove = draw;
    };
 
    // 记录当前是否在画图
    var isDrawing = false;
 
    // 开始画图
    function startDrawing(e) {
      isDrawing = true;
      // 创建一个新的绘图路径
      context.beginPath();
      // 把画笔移动到鼠标位置
      context.moveTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);
    }
 
    // 停止画图
    function stopDrawing() {
      isDrawing = false;
    }
 
    //画图中
    function draw(e) {
      if (isDrawing == true) {
        // 找到鼠标最新位置
        var x = e.pageX - canvas.offsetLeft;
        var y = e.pageY - canvas.offsetTop;
        // 画一条直线到鼠标最新位置
        context.lineTo(x, y);
        context.stroke();  
      }
    }
 
    // 保存之前选择的颜色的画笔 <img> 元素标签
    var previousColorElement;
 
    // 改变画笔颜色
    function changeColor(color, imgElement) {    
      context.strokeStyle = color;
      // 将当前画笔的 <img> 元素标签设置为选中样式
      imgElement.className = "Selected";
      // 将之前的画笔的 <img> 元素标签恢复默认样式
      if (previousColorElement != null) previousColorElement.className = "";
      previousColorElement = imgElement;
    }
 
    // 保存之前选择的粗细的画笔 <img> 元素标签
    var previousThicknessElement;
 
    // 改变画笔粗细
    function changeThickness(thickness, imgElement) {    
      context.lineWidth = thickness;
      // 将当前画笔的 <img> 元素标签设置为选中样式
      imgElement.className = "Selected";
      // 将之前的画笔的 <img> 元素标签恢复默认样式
      if (previousThicknessElement != null) previousThicknessElement.className = "";
      previousThicknessElement = imgElement;
    }
 
    // 清除画布
    function clearCanvas() {
      context.clearRect(0, 0, canvas.width, canvas.height);
    }
 
    // 保存画布
    function saveCanvas() {
      // 找到预览的 <img> 元素标签
      var imageCopy = document.getElementById("savedImageCopy");
      // 将画布内容在img元素中显示
      imageCopy.src = canvas.toDataURL(); 
      // 显示右键保存的提示
      var imageContainer = document.getElementById("savedCopyContainer");
      imageContainer.style.display = "block";
    }
  </script>
</head>
 
<body>
  <div class="Toolbar">
    - 颜色 -<br>
    <img id="redPen" src="pen_red.gif" alt="红色" onclick="changeColor('rgb(212,21,29)', this)">
    <img id="greenPen" src="pen_green.gif" alt="绿色" onclick="changeColor('rgb(131,190,61)', this)">
    <img id="bluePen" src="pen_blue.gif" alt="蓝色" onclick="changeColor('rgb(0,86,166)', this)">
  </div>
  <div class="Toolbar">
    - 粗细 -<br>
    <img src="pen_thin.gif" alt="细" onclick="changeThickness(1, this)">
    <img src="pen_medium.gif" alt="中" onclick="changeThickness(5, this)">
    <img src="pen_thick.gif" alt="粗" onclick="changeThickness(10, this)">
  </div>
  <div class="CanvasContainer">
    <canvas id="drawingCanvas" width="400" height="200"></canvas>
  </div>
  <div class="Toolbar">
    - 操作 -<br>
    <button onclick="saveCanvas()">保存图像</button>
    <button onclick="clearCanvas()">清除图像</button>
    <div id="savedCopyContainer">
      <img id="savedImageCopy"><br>
      使用右键保存图像 ...
    </div>
  </div>
</body>
</html>

--- paint.css ---

body {
  background: white;
}
 
.Toolbar {
  float: left;
  font-family: 'Trebuchet MS';
  font-size: 14px;
  font-variant: small-caps;
  text-align: center;
  background: #F2F7FE;
  padding: 10px 15px 3px 10px;
  margin-bottom: 1px;
  margin-right: 1px;
  border: 1px solid #7B899B;
}
 
.Toolbar button {
  padding: 6px;
  margin: 7px 2px;
  font-variant: normal;
  font-size: 12px;
}
 
.CanvasContainer {
  clear: both;
}
 
canvas {
  border: 1px solid #7B899B;
}
 
img {
  padding: 2px;
  border: 2px solid #F2F7FE;
}
 
img:hover {
  border: 2px groove #E4F0FE;
  background: white;
}
 
 
img.Selected {
  border: 2px groove #E4F0FE;
}
 
#savedCopyContainer {
  display: none;
}
 
#savedCopyContainer img {
  width: 250px;
  height: 125px;
}

2,将画布保存为图像

(1)调用<canvas>的 toDataURL() 方法,可以画布图像数据转换为字符序列并编码为数据URL。
1
var url = canvas.toDataURL();
(2)toDataURL()方法如果不提供参数,得到的将是一个PNG图片。如果想要其他格式的图片,可以传入相应的 MIME 类型。
1
var url = canvas.toDataURL("image/jpeg");
(3)数据URL就是一个以 data:image/png;base64 开头的 base-64 编码的字符串。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6%2BR8AAAAlElEQVR42oWQQRHEIAxF10ElVAISVgo3bCABCUhYCZWAhEpAQpoD6bzJhNnDO0DyyA8fEXkppXyVCpLViDUfyqVIQN9JFMY637hrlCySFauL21E7KVWbAIGx56rnSLqc5KPXSLo3kySalPhTygFhRDtFC09EIsMeZJSGBj7Qveh3OJW89syImiH%2BIO2BOJX0XwA2%2BQEL4pAhSX4aBQAAAABJRU5ErkJggg%3D%3D

(4)数据URL很适合传输图像,除了可以发送到Web服务器在后台保存下来,也可以作为<img>元素的src属性值显示出来。

// 找到预览的 <img> 元素标签
var imageCopy = document.getElementById("savedImageCopy");
// 将画布内容在img元素中显示
imageCopy.src = canvas.toDataURL();

 

 

时间: 2024-08-01 00:43:11

HTML5使用Canvas做一个在线画图程序(支持把画布保存为图像)的相关文章

用ASP学做一个在线调查

关于在线调查大家一定不会陌生吧,给出一个问题和数个答案,让用户填写,然后把结果保存到数据库,自动进行统计,最后给出个统计的图.这期的跟我学做就来做一个在线调查系统. 一.功能设计 这么简单的系统也要做功能设计?有的人也许会觉得奇怪,不过话说回来不管怎么样的系统,先做功能设计总是能对系统有个比较清析的了解.让我们来看看在线调查的功能吧.基本的功能上面已经说了,就是要给出一个问题和数个答案,然后统计,最后给出图.在这个基础上,我们可以考虑给一个调查加上一个时间段(有效期),在这个时间段里调查是有效的

mfc-MFC做一个截屏程序,保存到剪切板后怎么打开这个图

问题描述 MFC做一个截屏程序,保存到剪切板后怎么打开这个图 我在做一个MFC截图,不知道代码是否有错,估计没错,现在的疑问是如果代码没错的话,截完图保存到剪切板了,然后到哪里打开这个图void C截图Dlg::GetScreenCapture(){ //桌面窗口的设备上下文DC//画布 HDC hDesktopDC = ::CreateDC(_T(""DISPLAY"")NULLNULLNULL); //加::指出是API函数调用,不是成员函数调用 HDC hMe

想用做一个在线应用商店,大家给点思路

问题描述 目前想做一个在线的应用商店(类似iphone的应用商店,或者nokia的ovi应用商店等),主要在服务器上存放各种应用,也可以提供给用户上传自己的应用.当然我们会对用户上传的应用进行验证和管理.所有应用都放在服务器上,各种客户端通过访问服务器来下载自己想要的应用程序. 目前有两个问题,希望大家给点建议或思路: 1.客户端连接的问题,客户端可以能包括不同的客户端,怎么能让不同平台的客户端都能访问应用服务器,然后下载自己的想要的东西,也就是不同客户端与服务器通信的问题,如手机客户端,有ip

用ASP学做一个在线调查(1)

关于在线调查大家一定不会陌生吧,给出一个问题和数个答案,让用户填写, 然后把结果保存到数据库,自动进行统计,最后给出个统计的图.这期的跟我学 做就来做一个在线调查系统. 一.功能设计 这么简单的系统也要 做功能设计?有的人也许会觉得奇怪,不过话说回来不管怎么样的系统,先做功 能设计总是能对系统有个比较清析的了解.让我们来看看在线调查的功能吧.基 本的功能上面已经说了,就是要给出一个问题和数个答案,然后统计,最后给出 图.在这个基础上,我们可以考虑给一个调查加上一个时间段(有效期),在这 个时间段

c#-想用C#做一个JTAG烧录程序

问题描述 想用C#做一个JTAG烧录程序 各位大神,请教一下,有没有人做过C#的JTAG烧录程序,要求很简单,就是用C#写个程序,通过JTAG给板子下载程序 解决方案 这个要结合你的硬件http://download.csdn.net/download/nm275490806/4529461 C#这里主要就是用com通讯(serialsport)连接你的设备. 解决方案二: http://wenku.baidu.com/link?url=hzm1k5nNXFOHI9QSwuSrVNQnf5Bjr

移动支付-如果要做一个在线翻译服务交易平台,在iOS客户端中如何避免使用IAP支付?

问题描述 如果要做一个在线翻译服务交易平台,在iOS客户端中如何避免使用IAP支付? ==背景== 想做一个在线翻译服务交易平台的产品.分别有Windows PC.Android和iOS三个客户端. 此处所说的*翻译服务*主要是指:某些用户提交待翻译内容,另一些用户提供翻译服务并按服务时间(每小时多少钱)或者翻译文本数量(每千字多少钱)收取费用. 设想的方案是:产品提供一套积分(虚拟货币)体系,所有在产品内的交易均使用虚拟货币完成.虚拟货币可以*随用随充*,也可以*先充后用*,也可以*先赚后用*

c++ 作图-刚刚抄的一个c++画图程序,编译通过无法运行,感谢各位指教,虚心学习

问题描述 刚刚抄的一个c++画图程序,编译通过无法运行,感谢各位指教,虚心学习 #include #include #include #include #define pi 3.1415926 long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam); bool InitWindowsClass(HINSTANCE hIntance); bool InitWindows(HINSTANCE hInstance,int

我想用C#做一个WINDOWS窗体程序自动填写一个网站的密码和用户名并登陆进网站!

问题描述 我想做一个WINDOWS窗体程序自动填写一个网站网站密码和用户名并登陆进网站?就是用WINDOWS程序操控网页上面的文本框和按钮!请要用到些什么技术?有没有一些实例,请大侠们介绍介绍? 解决方案 解决方案二:user32.dll里面有函数可以获取窗体.找到浏览器之后再操作吧.解决方案三:使用HttpWebRequestHttpWebResponse类或者WebClient需要借助HttpLook等工具解决方案四:建议你使用Watir,网页测试用的,可以控制网页中的一切解决方案五:或者w

问一下大家能不能做一个这样的程序!

问题描述 就是检测屏幕上的游戏人物,然后添加一个红框!c#可以办到这一点吗?给点思路谢谢!设计到哪方面的知识!! 解决方案 解决方案二: 解决方案三:这是什么?三维场景??这是用3D引擎做的,一般都是用C++做,C#不行.解决方案四:c3dEngine你试试这个软件,解决方案五:LZ估计说的是类似外挂的程序吧..就是检测人物然后自动瞄准开*什么的..能是肯定能..只不过我不会...解决方案六:"做一个这样的程序",那么僵尸是预先"知道"何时存在.什么状态.什么位置的