【问题标题】:Can I center canvas image我可以将画布图像居中吗
【发布时间】:2019-03-05 15:32:00
【问题描述】:

我正在绘制一个大画布图像作为背景,图像大于窗口大小。我想知道是否有办法让我将图像居中以适合全屏。如果是这样,怎么做?这就是我正在做的:

        var canvas = document.getElementById('canvas'),
            context = canvas.getContext('2d');

        window.addEventListener('resize', resizeCanvas, false);

        function resizeCanvas() {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;

            drawStuff(); 
        }

        resizeCanvas();

        function drawStuff() {
            var imageObj = new Image();

            imageObj.onload = function() {
                context.drawImage(imageObj, 69, 50);
            };

            imageObj.src = '/resources/img/bg.png';
        }        

【问题讨论】:

    标签: javascript canvas html5-canvas


    【解决方案1】:

    这是一种不使用变换将图像居中到画布的可选方法(另请参见下面的注释):

    imageObj.onload = function() {
    
        var x = (canvas.width  - this.width ) * 0.5,   // this = image loaded
            y = (canvas.height - this.height) * 0.5;
    
        ctx.drawImage(this, x, y);
    };
    

    由于图像大于画布 x 和 y 在这种情况下将为负数,这非常好。如果图像更小,它也可以正常工作。如果您在负载处理程序之外进行绘图,您当然需要使用imageObj 而不是this

    注意:您设置调整大小处理程序的方式并不是处理图像重新定位的最佳方式 - 您应该只加载一次图像,然后重复使用该对象。由于调整大小通常会创建许多事件,因此会触发相同数量的图像重新加载。

    为了让它正常工作,你可以这样做:

    var canvas = document.getElementById('canvas'),
        context = canvas.getContext('2d'),
    
        imageObj = new Image();  // declare globally
    
    imageObj.onload = function() {
    
        // now set up handler when image is actually loaded
        // - else drawImage will fail (width, height is not available and no data)
        window.addEventListener('resize', resizeCanvas, false);
    
        // initial call to draw image first time
        resizeCanvas();  
    };
    
    imageObj.src = '/resources/img/bg.png';
    
    function resizeCanvas() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
    
        drawStuff(); 
    }
    
    function drawStuff() {
        var x = (canvas.width  - imageObj.width ) * 0.5,
            y = (canvas.height - imageObj.height) * 0.5;
    
        ctx.drawImage(imageObj, x, y);
    }        
    

    这并不完美,因为调整大小事件队列仍然很大并且可能会滞后 - 也有解决方案,例如 this one(稍作修改)。

    【讨论】:

      【解决方案2】:

      以下是如何使图像在画布上居中。任何垂直或水平溢出都将在画布外:

      imageObj.onload = function() {
          ctx.translate(canvas.width/2,canvas.height/2);
          ctx.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
          ctx.translate(-canvas.width/2,-canvas.height/2);
      };
      

      祝你的项目好运!

      【讨论】:

        【解决方案3】:

        如果您在上传后添加图片,那么您可以使用它,它对我有用 :) var image_center_width = (canvas.width - img.width) / 2; var image_center_height = (canvas.height - img.height) / 2;

                                img.set({
                                        left : image_center_width,
                                        top : image_center_height,
                                    });
                            canvas.add(img)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-28
          • 1970-01-01
          • 1970-01-01
          • 2016-11-24
          • 1970-01-01
          • 2012-01-20
          相关资源
          最近更新 更多