123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /**
- * 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);
|