Подтвердить что ты не робот

Холст HTML5: Масштабирование

Есть ли какой-нибудь простой способ как увеличить и уменьшить масштаб в холсте (JavaScript)? В основном у меня есть холст размером 400x400 пикселей, и я хотел бы иметь возможность увеличивать с помощью mousedown (2x) и возвращаться с помощью 'mouseup'.

Последние два дня потратил на поиски, но пока не повезло. :(

4b9b3361

Ответ 1

Основываясь на предположении использования drawImage, вы также можете комбинировать его с функцией масштабирования.

Итак, перед тем, как вы нарисуете масштаб изображения в контексте требуемого уровня масштабирования:

ctx.scale(2, 2) // Doubles size of anything draw to canvas.

Я создал здесь небольшой пример http://jsfiddle.net/mBzVR/4/, который использует drawImage и масштабирование для увеличения размера мыши и выхода на мышь.

Ответ 2

Просто попробуйте это:

<!DOCTYPE HTML>
<html>
    <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
        <style>
            body {
                margin: 0px;
                padding: 0px;
            }

            #wrapper {
                position: relative;
                border: 1px solid #9C9898;
                width: 578px;
                height: 200px;
            }

            #buttonWrapper {
                position: absolute;
                width: 30px;
                top: 2px;
                right: 2px;
            }

            input[type =
            "button"] {
                padding: 5px;
                width: 30px;
                margin: 0px 0px 2px 0px;
            }
        </style>
        <script>
            function draw(scale, translatePos){
                var canvas = document.getElementById("myCanvas");
                var context = canvas.getContext("2d");

                // clear canvas
                context.clearRect(0, 0, canvas.width, canvas.height);

                context.save();
                context.translate(translatePos.x, translatePos.y);
                context.scale(scale, scale);
                context.beginPath(); // begin custom shape
                context.moveTo(-119, -20);
                context.bezierCurveTo(-159, 0, -159, 50, -59, 50);
                context.bezierCurveTo(-39, 80, 31, 80, 51, 50);
                context.bezierCurveTo(131, 50, 131, 20, 101, 0);
                context.bezierCurveTo(141, -60, 81, -70, 51, -50);
                context.bezierCurveTo(31, -95, -39, -80, -39, -50);
                context.bezierCurveTo(-89, -95, -139, -80, -119, -20);
                context.closePath(); // complete custom shape
                var grd = context.createLinearGradient(-59, -100, 81, 100);
                grd.addColorStop(0, "#8ED6FF"); // light blue
                grd.addColorStop(1, "#004CB3"); // dark blue
                context.fillStyle = grd;
                context.fill();

                context.lineWidth = 5;
                context.strokeStyle = "#0000ff";
                context.stroke();
                context.restore();
            }

            window.onload = function(){
                var canvas = document.getElementById("myCanvas");

                var translatePos = {
                    x: canvas.width / 2,
                    y: canvas.height / 2
                };

                var scale = 1.0;
                var scaleMultiplier = 0.8;
                var startDragOffset = {};
                var mouseDown = false;

                // add button event listeners
                document.getElementById("plus").addEventListener("click", function(){
                    scale /= scaleMultiplier;
                    draw(scale, translatePos);
                }, false);

                document.getElementById("minus").addEventListener("click", function(){
                    scale *= scaleMultiplier;
                    draw(scale, translatePos);
                }, false);

                // add event listeners to handle screen drag
                canvas.addEventListener("mousedown", function(evt){
                    mouseDown = true;
                    startDragOffset.x = evt.clientX - translatePos.x;
                    startDragOffset.y = evt.clientY - translatePos.y;
                });

                canvas.addEventListener("mouseup", function(evt){
                    mouseDown = false;
                });

                canvas.addEventListener("mouseover", function(evt){
                    mouseDown = false;
                });

                canvas.addEventListener("mouseout", function(evt){
                    mouseDown = false;
                });

                canvas.addEventListener("mousemove", function(evt){
                    if (mouseDown) {
                        translatePos.x = evt.clientX - startDragOffset.x;
                        translatePos.y = evt.clientY - startDragOffset.y;
                        draw(scale, translatePos);
                    }
                });

                draw(scale, translatePos);
            };



            jQuery(document).ready(function(){
               $("#wrapper").mouseover(function(e){
                  $('#status').html(e.pageX +', '+ e.pageY);
               }); 
            })  
        </script>
    </head>
    <body onmousedown="return false;">
        <div id="wrapper">
            <canvas id="myCanvas" width="578" height="200">
            </canvas>
            <div id="buttonWrapper">
                <input type="button" id="plus" value="+"><input type="button" id="minus" value="-">
            </div>
        </div>
        <h2 id="status">
        0, 0
        </h2>
    </body>
</html>

Работает идеально для меня с масштабированием и движением мыши.. вы можете настроить его на колесико мыши вверх и вниз Njoy!!!

Ответ 3

Холст IIRC - растровый растровый стиль. он не будет масштабироваться, потому что нет сохраненной информации для увеличения.

Лучше всего сохранить две копии в памяти (увеличенные и не) и поменять их при щелчке мышью.

Ответ 4

Если у вас есть исходное изображение или элемент холста и ваш холст 400x400, который вы хотите рисовать, вы можете использовать метод drawImage для достижения масштабирования.

Так, например, полный вид может выглядеть следующим образом:

ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);

И увеличенный вид может выглядеть следующим образом:

ctx.drawImage(img, img.width / 4, img.height / 4, img.width / 2, img.height / 2, 0, 0, canvas.width, canvas.height);

Первым параметром drawImage является элемент изображения или элемент холста для рисования, следующие 4 - это x, y, ширина и высота для выборки из источника, а последние 4 параметра - это x, y, ширина и высота регион рисовать на холсте. Затем он будет обрабатывать масштабирование для вас.

Вам просто нужно будет выбрать ширину и высоту для исходного образца на основе уровня масштабирования и x и y на основе того, где нажимается мышь, минус половину расчетной ширины и высоты (но вам нужно будет обеспечить прямоугольник не выходит за пределы).

Ответ 5

Один из вариантов заключается в использовании функции масштабирования css:

$("#canvas_id").css("zoom","x%");