HTML5画布–自定义画笔(BezierCurveBrush)
HTML5 canvas – Custom brush (BezierCurveBrush) for your paing program I hope that you still remember when we did our first Paint program with HTML5. Today I have decided to enhance it with adding new additional brush to it. This brush will use ‘bezierCurveTo’ function. In result we will have interesting effect, just check out it!
HTML5 canvas –用于您的paing程序的自定义画笔(BezierCurveBrush)我希望您仍然记得我们使用HTML5 编写第一个Paint程序时的情况 。 今天,我决定通过添加新的画笔来增强它。 该笔刷将使用“ bezierCurveTo”功能。 结果,我们将产生有趣的效果,只需检查一下即可!
Here are our demo and downloadable package:
这是我们的演示和可下载的软件包:
现场演示
打包下载
Ok, download the source files and lets start coding !
好的,下载源文件并开始编码!
步骤1. HTML (Step 1. HTML)
Here are html code of our enhanced Paint:
以下是增强型Paint的html代码:
index.html (index.html)
<!DOCTYPE html> <html lang="en" > <head> <meta charset="utf-8" /> <title>HTML5 canvas - Custom brush (BezierCurveBrush) for your paing program | Script Tutorials</title> <link href="css/main.css" rel="stylesheet" type="text/css" /> <script src="js/jquery-1.5.2.min.js"></script> <script src="js/script.js"></script> </head> <body> <header> <h2>HTML5 canvas - Custom brush (BezierCurveBrush) for your paing program</h2> <a href="https://www.script-tutorials.com/html5-canvas-custom-brush1/" class="stuts">Back to original tutorial on <span>Script Tutorials</span></a> </header> <div class="container"> <div class="column1"> <canvas id="color" width="500" height="128"></canvas> </div> <div class="column2"> <div>Preview:</div> <div id="preview"></div> <div id="pick"></div> </div> <div style="clear:both;"></div> </div> <canvas id="panel" width="1000" height="600"></canvas> </body> </html>
<!DOCTYPE html> <html lang="en" > <head> <meta charset="utf-8" /> <title>HTML5 canvas - Custom brush (BezierCurveBrush) for your paing program | Script Tutorials</title> <link href="css/main.css" rel="stylesheet" type="text/css" /> <script src="js/jquery-1.5.2.min.js"></script> <script src="js/script.js"></script> </head> <body> <header> <h2>HTML5 canvas - Custom brush (BezierCurveBrush) for your paing program</h2> <a href="https://www.script-tutorials.com/html5-canvas-custom-brush1/" class="stuts">Back to original tutorial on <span>Script Tutorials</span></a> </header> <div class="container"> <div class="column1"> <canvas id="color" width="500" height="128"></canvas> </div> <div class="column2"> <div>Preview:</div> <div id="preview"></div> <div id="pick"></div> </div> <div style="clear:both;"></div> </div> <canvas id="panel" width="1000" height="600"></canvas> </body> </html>[/code]
步骤2. CSS (Step 2. CSS)
Here are used CSS styles
这是使用CSS样式
css / main.css (css/main.css)
/* page layout styles */ *{ margin:0; padding:0; } body { background-color:#eee; color:#fff; font:14px/1.3 Arial,sans-serif; } header { background-color:#212121; box-shadow: 0 -1px 2px #111111; display:block; height:70px; position:relative; width:100%; z-index:100; } header h2{ font-size:22px; font-weight:normal; left:50%; margin-left:-400px; padding:22px 0; position:absolute; width:540px; } header a.stuts,a.stuts:visited{ border:none; text-decoration:none; color:#fcfcfc; font-size:14px; left:50%; line-height:31px; margin:23px 0 0 110px; position:absolute; top:0; } header .stuts span { font-size:22px; font-weight:bold; margin-left:5px; } .container { color: #000; margin: 20px auto; overflow: hidden; position: relative; width: 800px; } /* custom styles */ .column1 { float:left; width:500px; } .column2 { float:left; padding-left:20px; width:170px; } #panel { border:1px #000 solid; box-shadow:4px 6px 6px #444444; cursor:crosshair; display:block; margin:0 auto; height:600px; width:1000px; } #color { border:1px #000 solid; box-shadow:0px 4px 6px #444444; cursor:crosshair; } .column2 > div { margin-bottom:10px; } #preview, #pick { border:1px #000 solid; box-shadow:2px 3px 3px #444444; height:40px; width:80px; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; }
/* page layout styles */ *{ margin:0; padding:0; } body { background-color:#eee; color:#fff; font:14px/1.3 Arial,sans-serif; } header { background-color:#212121; box-shadow: 0 -1px 2px #111111; display:block; height:70px; position:relative; width:100%; z-index:100; } header h2{ font-size:22px; font-weight:normal; left:50%; margin-left:-400px; padding:22px 0; position:absolute; width:540px; } header a.stuts,a.stuts:visited{ border:none; text-decoration:none; color:#fcfcfc; font-size:14px; left:50%; line-height:31px; margin:23px 0 0 110px; position:absolute; top:0; } header .stuts span { font-size:22px; font-weight:bold; margin-left:5px; } .container { color: #000; margin: 20px auto; overflow: hidden; position: relative; width: 800px; } /* custom styles */ .column1 { float:left; width:500px; } .column2 { float:left; padding-left:20px; width:170px; } #panel { border:1px #000 solid; box-shadow:4px 6px 6px #444444; cursor:crosshair; display:block; margin:0 auto; height:600px; width:1000px; } #color { border:1px #000 solid; box-shadow:0px 4px 6px #444444; cursor:crosshair; } .column2 > div { margin-bottom:10px; } #preview, #pick { border:1px #000 solid; box-shadow:2px 3px 3px #444444; height:40px; width:80px; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; }[/code]
步骤3. JS (Step 3. JS)
js / script.js (js/script.js)
var canvas; var canvasColor; var ctx; var ctxColor; var bMouseDown = false; var selColorR = 0; var selColorG = 0; var selColorB = 0; var BezierCurveBrush = { // inner variables iPrevX : 0, iPrevY : 0, points : null, // initialization function init: function () { }, startCurve: function (x, y) { this.iPrevX = x; this.iPrevY = y; this.points = new Array(); }, getPoint: function (iLength, a) { var index = a.length - iLength, i; for (i=index; i< a.length; i++) { if (a[i]) { return a[i]; } } }, draw: function (x, y) { if (Math.abs(this.iPrevX - x) > 5 || Math.abs(this.iPrevY - y) > 5) { this.points.push([x, y]); // draw main path stroke ctx.beginPath(); ctx.moveTo(this.iPrevX, this.iPrevY); ctx.lineTo(x, y); ctx.lineWidth = 1; ctx.strokeStyle = 'rgba(' + selColorR + ', ' + selColorG + ', ' + selColorB + ', 0.9)'; ctx.stroke(); ctx.closePath(); // draw extra strokes ctx.strokeStyle = 'rgba(' + selColorR + ', ' + selColorG + ', ' + selColorB + ', 0.2)'; ctx.beginPath(); var iStartPoint = this.getPoint(25, this.points); var iFirstPoint = this.getPoint(1, this.points); var iSecondPoint = this.getPoint(5, this.points); ctx.moveTo(iStartPoint[0],iStartPoint[1]); ctx.bezierCurveTo(iFirstPoint[0], iFirstPoint[1], iSecondPoint[0], iSecondPoint[1], x, y); ctx.stroke(); ctx.closePath(); this.iPrevX = x; this.iPrevY = y; } } }; $(function(){ // creating canvas objects canvas = document.getElementById('panel'); ctx = canvas.getContext('2d'); canvasColor = document.getElementById('color'); ctxColor = canvasColor.getContext('2d'); drawGradients(ctxColor); BezierCurveBrush.init(); $('#color').mousemove(function(e) { // mouse move handler var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; var pixelColor = 'rgba('+pixel[0]+', '+pixel[1]+', '+pixel[2]+', '+pixel[3]+')'; $('#preview').css('backgroundColor', pixelColor); }); $('#color').click(function(e) { // mouse click handler var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; var pixelColor = 'rgba('+pixel[0]+', '+pixel[1]+', '+pixel[2]+', '+pixel[3]+')'; $('#pick').css('backgroundColor', pixelColor); selColorR = pixel[0]; selColorG = pixel[1]; selColorB = pixel[2]; }); $('#panel').mousedown(function(e) { // mouse down handler bMouseDown = true; var canvasOffset = $(canvas).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); BezierCurveBrush.startCurve(canvasX, canvasY, false, false, false, false, false, false, canvasX, canvasY, 0, 0); }); $('#panel').mouseup(function(e) { // mouse up handler bMouseDown = false; }); $('#panel').mousemove(function(e) { // mouse move handler if (bMouseDown) { var canvasOffset = $(canvas).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); BezierCurveBrush.draw(canvasX, canvasY, false, false, false, false, false, false, canvasX, canvasY, 0, 0); } }); }); function drawGradients() { var grad = ctxColor.createLinearGradient(20, 0, canvasColor.width - 20, 0); grad.addColorStop(0, 'red'); grad.addColorStop(1 / 6, 'orange'); grad.addColorStop(2 / 6, 'yellow'); grad.addColorStop(3 / 6, 'green') grad.addColorStop(4 / 6, 'aqua'); grad.addColorStop(5 / 6, 'blue'); grad.addColorStop(1, 'purple'); ctxColor.fillStyle=grad; ctxColor.fillRect(0, 0, canvasColor.width, canvasColor.height); }
var canvas; var canvasColor; var ctx; var ctxColor; var bMouseDown = false; var selColorR = 0; var selColorG = 0; var selColorB = 0; var BezierCurveBrush = { // inner variables iPrevX : 0, iPrevY : 0, points : null, // initialization function init: function () { }, startCurve: function (x, y) { this.iPrevX = x; this.iPrevY = y; this.points = new Array(); }, getPoint: function (iLength, a) { var index = a.length - iLength, i; for (i=index; i< a.length; i++) { if (a[i]) { return a[i]; } } }, draw: function (x, y) { if (Math.abs(this.iPrevX - x) > 5 || Math.abs(this.iPrevY - y) > 5) { this.points.push([x, y]); // draw main path stroke ctx.beginPath(); ctx.moveTo(this.iPrevX, this.iPrevY); ctx.lineTo(x, y); ctx.lineWidth = 1; ctx.strokeStyle = 'rgba(' + selColorR + ', ' + selColorG + ', ' + selColorB + ', 0.9)'; ctx.stroke(); ctx.closePath(); // draw extra strokes ctx.strokeStyle = 'rgba(' + selColorR + ', ' + selColorG + ', ' + selColorB + ', 0.2)'; ctx.beginPath(); var iStartPoint = this.getPoint(25, this.points); var iFirstPoint = this.getPoint(1, this.points); var iSecondPoint = this.getPoint(5, this.points); ctx.moveTo(iStartPoint[0],iStartPoint[1]); ctx.bezierCurveTo(iFirstPoint[0], iFirstPoint[1], iSecondPoint[0], iSecondPoint[1], x, y); ctx.stroke(); ctx.closePath(); this.iPrevX = x; this.iPrevY = y; } } }; $(function(){ // creating canvas objects canvas = document.getElementById('panel'); ctx = canvas.getContext('2d'); canvasColor = document.getElementById('color'); ctxColor = canvasColor.getContext('2d'); drawGradients(ctxColor); BezierCurveBrush.init(); $('#color').mousemove(function(e) { // mouse move handler var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; var pixelColor = 'rgba('+pixel[0]+', '+pixel[1]+', '+pixel[2]+', '+pixel[3]+')'; $('#preview').css('backgroundColor', pixelColor); }); $('#color').click(function(e) { // mouse click handler var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; var pixelColor = 'rgba('+pixel[0]+', '+pixel[1]+', '+pixel[2]+', '+pixel[3]+')'; $('#pick').css('backgroundColor', pixelColor); selColorR = pixel[0]; selColorG = pixel[1]; selColorB = pixel[2]; }); $('#panel').mousedown(function(e) { // mouse down handler bMouseDown = true; var canvasOffset = $(canvas).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); BezierCurveBrush.startCurve(canvasX, canvasY, false, false, false, false, false, false, canvasX, canvasY, 0, 0); }); $('#panel').mouseup(function(e) { // mouse up handler bMouseDown = false; }); $('#panel').mousemove(function(e) { // mouse move handler if (bMouseDown) { var canvasOffset = $(canvas).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); BezierCurveBrush.draw(canvasX, canvasY, false, false, false, false, false, false, canvasX, canvasY, 0, 0); } }); }); function drawGradients() { var grad = ctxColor.createLinearGradient(20, 0, canvasColor.width - 20, 0); grad.addColorStop(0, 'red'); grad.addColorStop(1 / 6, 'orange'); grad.addColorStop(2 / 6, 'yellow'); grad.addColorStop(3 / 6, 'green') grad.addColorStop(4 / 6, 'aqua'); grad.addColorStop(5 / 6, 'blue'); grad.addColorStop(1, 'purple'); ctxColor.fillStyle=grad; ctxColor.fillRect(0, 0, canvasColor.width, canvasColor.height); }[/code]
What I have added – BezierCurveBrush object. This is pretty easy object with own Draw function where we use ‘bezierCurveTo’ function to draw curves between first point (in beginning of drawing) and all next stored points.
我添加的内容– BezierCurveBrush对象。 这是一个非常简单的对象,具有自己的Draw函数,在其中我们使用“ bezierCurveTo”函数在第一个点(在绘制开始时)和所有下一个存储点之间绘制曲线。
现场演示
打包下载
结论 (Conclusion)
Hope that today’s lesson was interesting for you. We made another one nice html5 sample. I will be glad to see your thanks and comments. Good luck!
希望今天的课程对您很有趣。 我们制作了另一个不错的html5示例。 看到您的感谢和评论,我将非常高兴。 祝好运!
翻译自: https://www.script-tutorials.com/html5-canvas-custom-brush1/
- html5 画笔(brush)
- Android自定义View之画笔与画布
- 自定义view的矩形 阶梯状 画笔 画布
- Android自定义View之画笔与画布(2)
- android 中的绘制类Paint 画笔,Canvas 画布,Bitmap 类和BitmapFactory及自定义属性
- 【Android】自定义View、画家(画布)Canvas与画笔Paint的应用——画图、涂鸦板app的实现
- HTML5——Canvas_03之【使用bezierCurveTo绘制贝塞尔曲线】
- HTML5画布KineticJS自定义形状的一些心得,呵呵!
- Android自定义View之画笔与画布
- HTML5快速入门实例(三)Canvas自定义画笔样式
- 自定义圆圈读条动画,画布画笔初入门
- 【Android】自定义View、画布Canvas与画笔Paint
- Android自定义View之画笔与画布
- Android自定义View之画笔与画布
- photoshop学习之路--------自定义画笔预设与图像动态效果的制作(gif格式输出)
- html5画布操作的简单学习-简单时钟
- HTML5 canvas 画布画圆
- HTML5画布(CANVAS)速查简表
- HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素
- HTML5画布弧教程