У меня есть блокнот для рисования, и я хочу наложить изображение, которое представляет собой просто контур (чтобы изображение было прозрачным, за исключением некоторых черных линий).

У меня так, чтобы можно было рисовать под изображением, но надо начинать рисовать за границей изображения и перемещаться под изображением. Таким образом, вы не можете начать прямо с изображения. Как это исправить?

Мой html просто:

<canvas id="canvas"></canvas>

<img id="html5" src="http://i.imgur.com/Wpx3Vum.png" style="position:absolute;left:100px;top:15px;" />

person fewaf    schedule 19.02.2014    source источник


Ответы (1)


Вместо этого вы можете использовать два элемента холста:

(ссылки предназначены только для примера)

Примером этого может быть включение простой базовой функции рисования:

Онлайн-демонстрация

HTML:

<div id="cont">
    <canvas id="canvasBottom" width=400 height=400></canvas>
    <canvas id="canvasTop" width=400 height=400></canvas>
</div>

CSS:

#cont {
    position:relative;
    border:1px solid #777;
    height:400px;
    }
#cont > canvas {
    position:absolute;
    left:0;
    top:0;
    cursor:crosshair;
    }

JavaScript:

Загрузите и установите изображение на верхний слой:

var img = new Image,
    canvas = document.getElementById('canvasBottom'),
    canvasTop = document.getElementById('canvasTop'),
    ctx = canvas.getContext('2d'),
    ctxMouse = canvasTop.getContext('2d');

img.onload = setup;
img.src = 'http://i.imgur.com/HNiER0v.png';

ctx.lineWidth = 5;
ctx.strokeStyle = 'rgb(0, 100, 255)';

function setup() {
    ctxMouse.drawImage(this, 0, 0);
}

Ручка мыши:

var px, py, isDown = false;

canvasTop.onmousedown = function (e) {
    var pos = getXY(e);
    px = pos.x;
    py = pos.y;
    isDown = true;
}

canvasTop.onmouseup = function () {
    isDown = false;
}

canvasTop.onmousemove = function (e) {
    if (isDown) {
        var pos = getXY(e);
        ctx.beginPath();
        ctx.moveTo(px, py);
        ctx.lineTo(pos.x, pos.y);
        ctx.stroke();
        px = pos.x;
        py = pos.y;
    }
}

function getXY(e) {
    var rect = canvasTop.getBoundingClientRect();
    return {
        x: e.clientX - rect.left,
        y: e.clientY - rect.top
    };
}

Как видите, теперь вы можете рисовать за первоначальным рисунком:

Причудливое изображение

(Теперь, если это не шедевр, то я не знаю, что такое шедевр..!)

person Community    schedule 19.02.2014
comment
это было здорово, большое спасибо! Вы сделали это очень легко понятным, я действительно ценю это. - person fewaf; 20.02.2014
comment
Так что это сработало отлично, единственное, что когда я добавляю изображение, оно становится очень большим. Я не могу понять, как его масштабировать... просто установка img.width = 200 ничего не делает. Любые идеи? - person fewaf; 20.02.2014
comment
@ user3285918 вы можете использовать расширенные параметры drawImage, например: ctxMouse.drawImage(0, 0, canvas.width, canvas.height); - person ; 20.02.2014