我想在单击时使用 canvas 在图像上绘制图案
I want to draw pattern on an image with canvas on click
我想在图像上绘制图案 canvas 单击您可以通过提供的图像了解更多信息
这是我想要的最终结果
http://i.imgur.com/wnH2Vxu.png
但我有这条模糊的线
http://i.imgur.com/HXF1rTv.png
我正在使用以下代码
(
function() {
var canvas = document.querySelector('#canvas');
var ctx = canvas.getContext('2d');
var sketch = document.querySelector('#sketch');
var sketch_style = getComputedStyle(sketch);
canvas.width = parseInt(sketch_style.getPropertyValue('width'));
canvas.height = parseInt(sketch_style.getPropertyValue('height'));
var mouse = {x: 0, y: 0};
var last_mouse = {x: 0, y: 0};
/* Mouse Capturing Work */
canvas.addEventListener('mousemove', function(e) {
last_mouse.x = mouse.x;
last_mouse.y = mouse.y;
mouse.x = e.pageX - this.offsetLeft;
mouse.y = e.pageY - this.offsetTop;
}, false);
var texture = document.getElementById("texture");
pFill = ctx.createPattern(texture, "repeat");
ctx.strokeStyle = pFill;
/* Drawing on Paint App */
ctx.lineWidth = 12;
ctx.lineJoin = 'square';
ctx.lineCap = 'square';
canvas.addEventListener('mousedown', function(e) {
canvas.addEventListener('mousemove', onPaint, false);
}, false);
canvas.addEventListener('mouseup', function() {
canvas.removeEventListener('mousemove', onPaint, false);
}, false);
var onPaint = function() {
ctx.beginPath();
ctx.moveTo(last_mouse.x, last_mouse.y);
ctx.lineTo(mouse.x, mouse.y);
ctx.closePath();
ctx.stroke();
};
}()
);
$( document ).ready(function() {
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
var img = document.getElementById("scream");
ctx.drawImage(img,10,10);
});
笔划模式的方法在这里不起作用。因为这个图案位置是固定的。因此,当您的线条不是完全水平或垂直时,您将得到一个扭曲的图像,而不是一连串准确的球。
嗯,我认为应该重新考虑整个方法。
用户应该像在 photoshop 中一样创建一个路径,该路径作为临时行可见。一开始它很容易成为多段线,通过点击指向顶点。并且当路径被确认(例如通过双击)时,您应该删除临时线并按照给定的步骤沿着路径放置球。在这种情况下,您可以处理所有转弯和规律性扭曲。
这是一大堆工作,但实际上任务比看起来要复杂得多。
作为快速解决方法,您可以尝试一种简单的方法。每次与前一次掉落的距离大于球半径(例如)的两倍时,掉落一个球..
var lastBall = {x: null, y : null};
function drawBall(center){
ctx.beginPath();
ctx.arc(center.x, center.y, 10, 0, 2 * Math.PI, false);
ctx.fillStyle = 'orange';
ctx.fill();
}
function distance(a, b){
return Math.sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
var onPaint = function() {
if(!lastBall.x || distance(lastBall, mouse) > 25 ){
drawBall(mouse);
lastBall.x = mouse.x;
lastBall.y = mouse.y;
}
代码很粗糙,你应该为颜色和半径定义适当的变量,或者用你的模式替换它,但你可以理解
我想在图像上绘制图案 canvas 单击您可以通过提供的图像了解更多信息 这是我想要的最终结果 http://i.imgur.com/wnH2Vxu.png 但我有这条模糊的线 http://i.imgur.com/HXF1rTv.png
我正在使用以下代码
(
function() {
var canvas = document.querySelector('#canvas');
var ctx = canvas.getContext('2d');
var sketch = document.querySelector('#sketch');
var sketch_style = getComputedStyle(sketch);
canvas.width = parseInt(sketch_style.getPropertyValue('width'));
canvas.height = parseInt(sketch_style.getPropertyValue('height'));
var mouse = {x: 0, y: 0};
var last_mouse = {x: 0, y: 0};
/* Mouse Capturing Work */
canvas.addEventListener('mousemove', function(e) {
last_mouse.x = mouse.x;
last_mouse.y = mouse.y;
mouse.x = e.pageX - this.offsetLeft;
mouse.y = e.pageY - this.offsetTop;
}, false);
var texture = document.getElementById("texture");
pFill = ctx.createPattern(texture, "repeat");
ctx.strokeStyle = pFill;
/* Drawing on Paint App */
ctx.lineWidth = 12;
ctx.lineJoin = 'square';
ctx.lineCap = 'square';
canvas.addEventListener('mousedown', function(e) {
canvas.addEventListener('mousemove', onPaint, false);
}, false);
canvas.addEventListener('mouseup', function() {
canvas.removeEventListener('mousemove', onPaint, false);
}, false);
var onPaint = function() {
ctx.beginPath();
ctx.moveTo(last_mouse.x, last_mouse.y);
ctx.lineTo(mouse.x, mouse.y);
ctx.closePath();
ctx.stroke();
};
}()
);
$( document ).ready(function() {
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
var img = document.getElementById("scream");
ctx.drawImage(img,10,10);
});
笔划模式的方法在这里不起作用。因为这个图案位置是固定的。因此,当您的线条不是完全水平或垂直时,您将得到一个扭曲的图像,而不是一连串准确的球。
嗯,我认为应该重新考虑整个方法。
用户应该像在 photoshop 中一样创建一个路径,该路径作为临时行可见。一开始它很容易成为多段线,通过点击指向顶点。并且当路径被确认(例如通过双击)时,您应该删除临时线并按照给定的步骤沿着路径放置球。在这种情况下,您可以处理所有转弯和规律性扭曲。
这是一大堆工作,但实际上任务比看起来要复杂得多。
作为快速解决方法,您可以尝试一种简单的方法。每次与前一次掉落的距离大于球半径(例如)的两倍时,掉落一个球..
var lastBall = {x: null, y : null};
function drawBall(center){
ctx.beginPath();
ctx.arc(center.x, center.y, 10, 0, 2 * Math.PI, false);
ctx.fillStyle = 'orange';
ctx.fill();
}
function distance(a, b){
return Math.sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
var onPaint = function() {
if(!lastBall.x || distance(lastBall, mouse) > 25 ){
drawBall(mouse);
lastBall.x = mouse.x;
lastBall.y = mouse.y;
}
代码很粗糙,你应该为颜色和半径定义适当的变量,或者用你的模式替换它,但你可以理解