#javascript #canvas
Я пытаюсь реализовать при помощи canvas функционал стирания изображения ластиком. Я создаю canvas и задаю ему background в CSS. Поверх canvas я делаю drawImage png картинки с прозрачностью, к которой я применяю ластик. Мне нужно проверить, стерта ли картинка полностью, то есть полностью ли прозрачный фон, и осуществить дальше какое-то действие. Мой метод создания канваса, отрисовки png на нем и процесса стирания: var img = new Image; var canvas = {}; function createCanvas(parent, width, height) { canvas.node = document.createElement('canvas'); canvas.context = canvas.node.getContext('2d'); img.onload = function(){ canvas.context.drawImage(img,200,0,img.width*1.2,img.height*1.2); // Or at whatever offset you like }; img.src = 'raccoon.png'; canvas.node.width = width || 100; canvas.node.height = height || 100; parent.appendChild(canvas.node); return canvas; } function init(container, width, height, fillColor) { var canvas = createCanvas(container, width, height); var ctx = canvas.context; // define a custom fillCircle method ctx.fillCircle = function(x, y, radius, fillColor) { this.fillStyle = fillColor; this.beginPath(); this.moveTo(x, y); this.arc(x, y, radius, 0, Math.PI * 2, false); this.fill(); }; ctx.clearTo = function(fillColor) { ctx.fillStyle = fillColor; ctx.fillRect(0, 0, width, height); }; // bind mouse events canvas.node.onmousemove = function(e) { if (!canvas.isDrawing) { return; } var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; var radius = 80; // or whatever var fillColor = '#000000'; ctx.globalCompositeOperation = 'destination-out'; ctx.fillCircle(x, y, radius, fillColor); }; canvas.node.onmousedown = function(e) { canvas.isDrawing = true; }; canvas.node.onmouseup = function(e) { canvas.isDrawing = false; if (isFullyTransparent()) { redirect(); }; }; } function isFullyTransparent() { var d = ctx.getImageData(0, 0, canvas.width, canvas.height).data; for (var i=3; i < d.length; i+=4) if (d[i]) return false return true } function redirect() { }; var container = document.getElementById('canvas'); init(container, 1024, 768, ''); Картинка для примера. Нужен метод, проверяющий, стерт енот полностью или нет.
Ответы
Ответ 1
Можно проверить все пиксели на прозрачность при помощи их перебора и поиска не 0 значения: Рисовать левой кнопкой мыши, стирать - правой var img = new Image; var canvas = {}; function createCanvas(parent, width, height) { canvas.node = document.createElement('canvas'); canvas.context = canvas.node.getContext('2d'); img.onload = function() { canvas.context.drawImage(img,0,0,img.width,img.height); canvas.context.globalCompositeOperation = 'destination-out'; }; img.crossOrigin = "anonymous"; img.src = 'https://i.imgur.com/GtBHNPS.png'; canvas.node.width = width || 100; canvas.node.height = height || 100; parent.appendChild(canvas.node); return canvas; } function init(container, width, height, fillColor) { var canvas = createCanvas(container, width, height); var ctx = canvas.context; ctx.fillCircle = function(x, y, radius, fillColor) { this.fillStyle = fillColor; this.beginPath(); this.moveTo(x, y); this.arc(x, y, radius, 0, Math.PI * 2, false); this.fill(); }; ctx.clearTo = function(fillColor) { ctx.fillStyle = fillColor; ctx.fillRect(0, 0, width, height); }; canvas.node.onmousemove = function(e) { if (!canvas.isDrawing) return; var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; var radius = 80; var fillColor = '#fff'; ctx.fillCircle(x, y, radius, fillColor); }; canvas.node.onmousedown = function(e) { canvas.isDrawing = true; }; canvas.node.onmouseup = function(e) { canvas.isDrawing = false; if (isFullyTransparent()) { redirect(); }; }; } function isFullyTransparent() { var d = canvas.context.getImageData(0, 0, canvas.node.width, canvas.node.height).data; for (var i=3; i < d.length; i+=4) if (d[i]) return false return true } function redirect() { alert('redirect') } init(document.body, 350, 350); body{ background: #000a; }
Комментариев нет:
Отправить комментарий