【问题标题】:Canvas - resize image and save to a variable画布 - 调整图像大小并保存到变量
【发布时间】:2017-06-02 00:40:24
【问题描述】:

所以,我有一个浏览器游戏,它由具有动态尺寸(它缩放到用户窗口的尺寸)的画布运行,它获取各种尺寸的图像,根据用户的窗口尺寸缩放它们并绘制它们: (我的调整大小算法示例:)

https://jsfiddle.net/8o3sn9mh/55/

var
canvas = document.getElementById('c'),
ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var flower = new Image();
//the src is actually local, but i put a url for example's sake
flower.src = "http://plainicon.com/dboard/userprod/2803_dd580/prod_thumb/plainicon.com-46129-128px-af2.png"
flower.onload = function(){
ctx.drawImage(flower,0,0,128,128, 0, 0, window.innerWidth / 2, window.innerHeight / 2);
}

如您所见,我正在绘制一个 128x128px 的图像,并将其调整为用户窗口的一半。所以,我在想 - 我的游戏可能会在每次渲染执行时执行此操作,并且每次执行它可能需要不必要的调整大小时间。所以:

1) 由于我每个 requestAnimationFrame 都使用它,因此执行此调整大小是否需要更多时间?

2) 有没有办法一次调整我的图像大小,将其保存到 var 中并使用它来节省时间?

无论如何,我想要一种方法将调整大小的图像保存到 var 中,以便将其放入画布的 createPattern 方法中:

pattern = ctx.createPattern(resizedFlower, 'repeat');  //resizedFlower should be the original flower resized into half's the user's window's width + height
ctx.fillStyle = pattern;
ctx.fillRect(0, 0, 50, 50);

【问题讨论】:

    标签: javascript canvas resize


    【解决方案1】:

    您可以将图像保存到画布上,然后在该画布上使用 drawImage。例如:

    var canvas = document.getElementById('c'),
    ctx = canvas.getContext('2d');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    
    var flowerCanvas = document.createElement('canvas');
    flowerCanvas.width = window.innerWidth;
    flowerCanvas.height = window.innerHeight;
    flowerCtx = flowerCanvas.getContext('2d');
    
    var flower = new Image();
    //the src is actually local, but i put a url for example's sake
    flower.src = "http://plainicon.com/dboard/userprod/2803_dd580/prod_thumb/plainicon.com-46129-128px-af2.png"
    flower.onload = function(){
        flowerCtx.drawImage(flower,0,0,128,128, 0, 0, window.innerWidth / 2, window.innerHeight / 2);
        ctx.drawImage(flowerCanvas,0,0);
    }
    

    现在您可以重复使用flowerCanvas,它将是您最初绘制的任何大小。您可能不会看到调整大小与不调整大小之间有太多的性能提升,尽管您应该确定它的基准。

    此外,您不应该每帧都调整所有内容的大小,您可以监听窗口调整大小事件,并在该事件触发时调整大小。

    【讨论】:

    • 好的,那么 1) 为什么你认为没有任何性能差异? 2)我认为实际制作 40 个画布(我有很多图像要调整大小)然后在每个画布上绘制它并不是最佳选择……是吗?(好吧,我可以将它用于我的 createPattern 方法不过)
    • “你也不应该在每一帧都调整大小,你可以监听窗口调整大小事件,并在该事件触发时调整大小。”你在这里是什么意思?我必须在每个 requestAnimationFrame 调整它的大小,因为原始图像比它应该在画布上实际绘制的更大/更小。我希望我的游戏角色与画布的尺寸成比例,因为它们是动态的。
    • 1) 好的,所以我测量了jsperf.com/canvas-resize296923 不调整大小的性能差异快 2%。 2)它会使用更多的内存,但除非你使用巨大的图像,否则应该不会有很大的性能差异。
    • 感谢您的评论。一个请求,你能回答我的第二条评论吗?
    • 关于我的最后评论,我的意思是,如果您将缩放大小与窗口大小联系起来,则只需在调整窗口大小时缩放一次(如果您使用多画布方法)。如果您要从原始图像中绘制它们,是的,您是正确的,您需要每帧调整它们的大小。
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2012-01-22
    • 1970-01-01
    • 2014-05-07
    • 2011-05-09
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多