You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
6.3 KiB

/**
* Created by yangjian on 17-9-18.
*/
(function($) {
// 设置元素可用状态
$.fn.enable = function() {
$(this).addClass("active");
$(this).removeAttr("disabled");
}
// 设置元素不可用状态
$.fn.disable = function() {
$(this).removeClass("active");
$(this).attr("disabled", true);
}
var Canvas = function(options) {
var configs = {
width : 360,
height : 300
}; //默认配置
options = options || {};
$.extend(configs, options);
var canvas = $("#"+configs.canvasId)[0]; //画布
canvas.width = configs.width;
canvas.height = configs.height;
var context = canvas.getContext("2d"); //绘图环境
context.lineCap = "round"; //设置线条两端为圆弧
context.lineJoin = "round"; //设置线条转折为圆弧
//设置默认颜色
setColor();
var $prevBtn = $("#J_prevStep"); //上一步
var $nextBtn = $("#J_nextStep"); //下一步
var $clearBtn = $("#J_clearBoard"); //清空画板
var drawing = false; //是否正在绘制
var erasering = false; //是否正在擦除
var prevSteps = []; //返回上一步操作集合
var nextSteps = []; //恢复下一步操作集合
var o = {};
$("#picBoard").css({
width : configs.width + "px",
height : configs.height + "px"
});
// 事件绑定
canvas.onmousedown = startDrawing;
canvas.onmouseup = stopDrawing;
canvas.onmouseout = stopDrawing;
canvas.onmousemove = doDrawing;
$prevBtn.on("click", gotoPrevStep);
$nextBtn.on("click", gotoNextStep);
$clearBtn.on("click", clearBoard);
// 清空设置
$("#clearSetting").on("click", function() {
context.lineWidth = 1;
setColor($(".colorBar span:first").data("color"));
context.shadowBlur = 0;
alert("画笔已重新初始化,请重新配置画笔。");
});
//上传背景图片
$("#J_canvas_bg").on("change", function() {
if ($("#picBoard img").length > 0) {
$("#picBoard img:eq(0)").attr("src", window.URL.createObjectURL(this.files[0]));
return;
}
var $img = '<img src="'+window.URL.createObjectURL(this.files[0])+'" width="'+configs.width+'" height="'+configs.height+'" />';
$("#picBoard").append($img);
// 激活删除背景按钮
$("#J_removeImg").enable();
});
// 删除背景图片
$("#J_removeImg").on("click", function() {
$("#picBoard").empty();
$(this).disable();
});
//保存图片
$('#J_saveImg').on("click", saveImage);
// 设置笔刷大小
$("#scrawl-main .brush-size").on("click", function() {
context.restore(); //恢复到canvas的上一个状态
context.lineWidth = parseInt($(this).text());
erasering = false;
});
// 设置笔触虚化
$("#scrawl-main .blur-size").on("click", function() {
context.shadowBlur = parseInt($(this).text());
});
// 橡皮擦功能
$("#scrawl-main .eraser-size").on("click", function() {
if (erasering == true) {
return;
}
erasering = true;
context.save(); //保存canvas状态
context.lineCap = "round"; //设置线条两端为圆弧
context.lineJoin = "round"; //设置线条转折为圆弧
context.lineWidth = 10;
context.globalCompositeOperation = "destination-out";
});
//设置颜色
$("#scrawl-main .colorBar span").on("click",function() {
$("#scrawl-main .colorBar .active").removeClass("active");
$(this).addClass("active");
setColor($(this).data("color"));
});
// 开始绘制
function startDrawing(e) {
drawing = true;
//记录上一步的数据
prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
// 创建一个新的绘图路径
context.beginPath();
// 把画笔移动到鼠标位置
var offset = $(canvas).offset();
context.moveTo(e.pageX - offset.left, e.pageY - offset.top);
}
// 停止绘制
function stopDrawing() {
drawing = false;
//清空下一步的数据集合,从新开始记录
nextSteps = [];
$nextBtn.disable();
if (prevSteps.length == 1) {
$prevBtn.enable();
$clearBtn.enable();
}
}
//绘制图像
function doDrawing(e) {
if (drawing) {
// 找到鼠标最新位置
var offset = $(canvas).offset();
var x = e.pageX - offset.left;
var y = e.pageY - offset.top;
// 画一条直线到鼠标最新位置
context.lineTo(x, y);
context.stroke();
}
}
/**
* 返回上一步操作
*/
function gotoPrevStep() {
if (prevSteps.length > 0) {
//保存当前状态到下一步的操作历史库
nextSteps.push(context.getImageData(0, 0, configs.width, configs.height));
var popData = prevSteps.pop();
context.putImageData(popData, 0, 0);
$nextBtn.enable();
if (prevSteps.length == 0) {
$prevBtn.disable();
}
}
}
/**
* 恢复下一步操作
*/
function gotoNextStep() {
if (nextSteps.length > 0) {
//保存当前状态到上一步的操作历史库
prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
var imgData = nextSteps.pop();
context.putImageData(imgData, 0, 0);
$prevBtn.enable();
if (nextSteps.length == 0) {
$nextBtn.disable();
}
}
}
/**
* 清空画板
*/
function clearBoard() {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
prevSteps = [];
nextSteps = [];
$prevBtn.disable();
$nextBtn.disable();
$clearBtn.disable();
}
/**
* 设置画笔颜色
* @param color
*/
function setColor(color) {
if (!color) {
color = $(".colorBar .active:eq(0)").data("color");
}
context.strokeStyle = color;
context.shadowColor = color;
}
/**
* 获取图片 base64 编码
*/
function saveImage(callback) {
if ($("#picBoard img").length > 0) {
var image = new Image();
image.src = $("#picBoard img:eq(0)").attr("src");
image.onload = function() {
context.save();
context.shadowBlur = 0;
context.shadowColor = '#FFF';
context.globalCompositeOperation = "destination-atop";
context.drawImage(this, 0, 0, configs.width, configs.height);
context.restore();
callback(canvas.toDataURL("image/png"));
}
} else {
callback(canvas.toDataURL("image/png"));
}
}
//要导出的API
o.nextStep = gotoNextStep;
o.prevStep = gotoNextStep;
o.setColor = setColor;
o.save = saveImage;
o.isEmpty = function() {
return prevSteps.length == 0;
}
return o;
}
window.Canvas = Canvas;
})(jQuery);