目前代码都是基于网上样例而改的:已经实现右键拖拽、滚轮放大小、左键涂鸦。
下一步想要增加的功能:在涂鸦后也可以进行右键拖拽、滚轮放大小并且不丢原来涂鸦内容。
<!DOCTYPE html>
<html>
<head>
<title>Canvas 拖拽、缩放、涂鸦</title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<script>
var mousePressed = false;
var lastX, lastY;
var canvas, ctx;
var height = document.documentElement.clientHeight;
var img,
imgIsLoaded,//图片是否加载完成;
imgX = 0,
imgY = 0,
imgScale = 1;//倍数
function InitThis() {
StopYouJian();
canvas = document.getElementById('myCanvas');
canvas.height = height - 200;
canvas.width = $(".jumbotron").width();
ctx = canvas.getContext("2d");
$(".col-lg-2").height(height - 50).css("overflow-y", "scroll");
img = new Image();
img.onload = function () {
imgIsLoaded = true;
drawImage();
};
img.src = "main.jpg";
$("#myCanvas").mousedown(function (e) {
mousePressed = true;
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
});
$("#myCanvas").mousemove(function (e) {
if (mousePressed) {
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
}
});
$("#myCanvas").mouseup(function (e) {
mousePressed = false;
});
$("#myCanvas").mouseleave(function (e) {
mousePressed = false;
});
canvas.onmousedown = function (event) {
var btnNum = event.button;
if (btnNum == 0) {
//左键
}
else if (btnNum == 1) {
//按下中键
}
else if (btnNum == 2) {
//鼠标右键
var pos = windowToCanvas(canvas, event.clientX, event.clientY);
canvas.onmousemove = function (event) {
canvas.style.cursor = "move";
var pos1 = windowToCanvas(canvas, event.clientX, event.clientY);
var x = pos1.x - pos.x;
var y = pos1.y - pos.y;
pos = pos1;
imgX += x;
imgY += y;
drawImage();
}
}
else {
//你的鼠标太神了,我识别不了
alert("你的鼠标太神了,我识别不了?你能告诉我你的鼠标品牌吗?我也想买一个。");
}
canvas.onmouseup = function () {
canvas.onmousemove = null;
canvas.onmouseup = null;
canvas.style.cursor = "default";
}
}
//滚动
canvas.onmousewheel = canvas.onwheel = function (event) {
var pos = windowToCanvas(canvas, event.clientX, event.clientY);
event.wheelDelta = event.wheelDelta ? event.wheelDelta : (event.deltaY * (-40));
if (event.wheelDelta > 0) {
imgScale *= 2;
imgX = imgX * 2 - pos.x;
imgY = imgY * 2 - pos.y;
} else {
imgScale /= 2;
imgX = imgX * 0.5 + pos.x * 0.5;
imgY = imgY * 0.5 + pos.y * 0.5;
}
drawImage();
}
}
function drawImage() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, img.width, img.height, imgX, imgY, img.width * imgScale, img.height * imgScale);
}
function clearArea() {
// Use the identity matrix while clearing the canvas
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
function Draw(x, y, isDown) {
if (isDown) {
ctx.beginPath();
ctx.strokeStyle = $("#selColor").val();
ctx.lineWidth = $("#selWidth").val();
ctx.lineJoin = "round";
ctx.moveTo(lastX, lastY);
ctx.lineTo(x, y);
ctx.closePath();
ctx.stroke();
}
lastX = x; lastY = y;
}
function windowToCanvas(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: x - bbox.left - (bbox.width - canvas.width) / 2,
y: y - bbox.top - (bbox.height - canvas.height) / 2
};
}
function StopYouJian() {
document.oncontextmenu = function () {
return false;
};
}
$(function () {
InitThis();
});
</script>
<style>
canvas {
border: 1px solid #fff;
}
</style>
</head>
<body>
<div class="container">
<div class="row" style="margin-top:10px;">
<div class="col-md-2 col-lg-2">
<div class="panel panel-primary">
<div class="panel-heading text-center">
美女
</div>
<div class="panel-body">
</div>
</div>
</div>
<div class="col-md-10 col-lg-10">
<div class="jumbotron">
<div align="center">
<canvas id="myCanvas"></canvas>
<div class="control-ops">
<button type="button" class="btn btn-primary" onclick="javascript:clearArea();return false;">清空画板</button>
Line width : <select id="selWidth">
<option value="2" selected="selected">2</option>
<option value="4">4</option>
<option value="6">6</option>
<option value="8">8</option>
<option value="10">10</option>
<option value="12">12</option>
<option value="36">36</option>
</select>
Color : <select id="selColor">
<option value="black">black</option>
<option value="blue">blue</option>
<option value="red" selected="selected">red</option>
<option value="green">green</option>
<option value="yellow">yellow</option>
<option value="gray">gray</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
请放到本地演示,并在当前目录放一张main.jpg的图片,这样看得清楚一点。
问题:在涂鸦后进行右键拖拽、滚轮放大小并且不丢原来涂鸦内容。
先使用getImageData保存画板图像数据,经过拖拽、缩放处理后,再用putImageData绘制保存的数据.
试了一下,保存不了。
@abc54288:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Canvas 拖拽、缩放、涂鸦</title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<script>
var mousePressed = false;
var lastX, lastY;
var canvas, ctx;
var height = document.documentElement.clientHeight;
var img,
imgIsLoaded,//图片是否加载完成;
imgX = 0,
imgY = 0,
imgScale = 1;//倍数
function InitThis() {
StopYouJian();
canvas = document.getElementById('myCanvas');
canvas.height = height - 200;
canvas.width = $(".jumbotron").width();
ctx = canvas.getContext("2d");
$(".col-lg-2").height(height - 50).css("overflow-y", "scroll");
img = new Image();
img.onload = function () {
imgIsLoaded = true;
drawImage();
};
img.src = "main.jpg";
$("#myCanvas").mousedown(function (e) {
mousePressed = true;
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
});
$("#myCanvas").mousemove(function (e) {
if (mousePressed) {
Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
}
});
$("#myCanvas").mouseup(function (e) {
mousePressed = false;
});
$("#myCanvas").mouseleave(function (e) {
mousePressed = false;
});
canvas.onmousedown = function (event) {
var btnNum = event.button;
if (btnNum == 0) {
//左键
}
else if (btnNum == 1) {
//按下中键
}
else if (btnNum == 2) {
//鼠标右键
var pos = windowToCanvas(canvas, event.clientX, event.clientY);
canvas.onmousemove = function (event) {
canvas.style.cursor = "move";
var pos1 = windowToCanvas(canvas, event.clientX, event.clientY);
var x = pos1.x - pos.x;
var y = pos1.y - pos.y;
pos = pos1;
imgX += x;
imgY += y;
drawImage();
}
}
else {
//你的鼠标太神了,我识别不了
alert("你的鼠标太神了,我识别不了?你能告诉我你的鼠标品牌吗?我也想买一个。");
}
canvas.onmouseup = function () {
canvas.onmousemove = null;
canvas.onmouseup = null;
canvas.style.cursor = "default";
}
}
//滚动
canvas.onmousewheel = canvas.onwheel = function (event) {
var pos = windowToCanvas(canvas, event.clientX, event.clientY);
event.wheelDelta = event.wheelDelta ? event.wheelDelta : (event.deltaY * (-40));
if (event.wheelDelta > 0) {
imgScale *= 2;
imgX = imgX * 2 - pos.x;
imgY = imgY * 2 - pos.y;
} else {
imgScale /= 2;
imgX = imgX * 0.5 + pos.x * 0.5;
imgY = imgY * 0.5 + pos.y * 0.5;
}
drawImage();
}
}
function drawImage() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, img.width, img.height, imgX, imgY, img.width * imgScale, img.height * imgScale);
}
function clearArea() {
// Use the identity matrix while clearing the canvas
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
function Draw(x, y, isDown) {
if (isDown) {
ctx.beginPath();
ctx.strokeStyle = $("#selColor").val();
ctx.lineWidth = $("#selWidth").val();
ctx.lineJoin = "round";
ctx.moveTo(lastX, lastY);
ctx.lineTo(x, y);
ctx.closePath();
ctx.stroke();
}
lastX = x; lastY = y;
}
function windowToCanvas(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: x - bbox.left - (bbox.width - canvas.width) / 2,
y: y - bbox.top - (bbox.height - canvas.height) / 2
};
}
function StopYouJian() {
document.oncontextmenu = function () {
return false;
};
}
var image=null;
function Save(){
image=ctx.getImageData(0,0,canvas.width,canvas.height);
}
function Move(){
clearArea();
ctx.putImageData(image,100,100);
}
$(function () {
InitThis();
});
</script>
<style>
canvas {
border: 1px solid #fff;
}
</style>
</head>
<body>
<div class="container">
<div class="row" style="margin-top:10px;">
<div class="col-md-2 col-lg-2">
<div class="panel panel-primary">
<div class="panel-heading text-center">
美女
</div>
<div class="panel-body">
</div>
</div>
</div>
<div class="col-md-10 col-lg-10">
<div class="jumbotron">
<div align="center">
<canvas id="myCanvas"></canvas>
<div class="control-ops">
<button type="button" class="btn btn-primary" onclick="javascript:Save();return false;">保存</button>
<button type="button" class="btn btn-primary" onclick="javascript:Move();return false;">移动</button>
<button type="button" class="btn btn-primary" onclick="javascript:clearArea();return false;">清空画板</button>
Line width : <select id="selWidth">
<option value="2" selected="selected">2</option>
<option value="4">4</option>
<option value="6">6</option>
<option value="8">8</option>
<option value="10">10</option>
<option value="12">12</option>
<option value="36">36</option>
</select>
Color : <select id="selColor">
<option value="black">black</option>
<option value="blue">blue</option>
<option value="red" selected="selected">red</option>
<option value="green">green</option>
<option value="yellow">yellow</option>
<option value="gray">gray</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
我简单加了两个按钮,一个保存画板数据,一个把保存的画板移动(100,100).
不太明白你的问题,你可以把canvas绘画过程封装,在拖放过程中运行就可以了。