【问题标题】:replacing old canvas with new one with scaled image用带有缩放图像的新画布替换旧画布
【发布时间】:2014-03-24 23:50:39
【问题描述】:

我有一个上面有加载图像的画布。画布具有静态宽度和高度 (800x600)。图像可以更小或更大。如果图片小于画布大小,则使用以下代码将其放在中间

x = (canvas.width - image.width)/2;
y = (canvas.height - image.height) / 2;
ctx.drawImage(image, x, y)

我现在想用一个新的画布替换旧的画布,该画布的图像按比例缩放。我的代码如下(出于测试目的,我将图像渲染在画布的左上角,尚未实现确切位置)

oldCanvas = document.getElementById('myCanvas');
newCanvas = document.createElement('canvas');
ctx = newCanvas.getContext('2d');
x = y = 0;
newImageWidth = image.width * 2;
newImageHeight = image.height * 2;
ctx.drawImage(oldCanvas, x, y, newImageWidth, newImageHeight);
oldCanvas.parentNode.replaceChild(newCanvas, oldCanvas)

但画布与旧画布相同。我尝试在不缩放图像的情况下进行相同的操作,但更改了 newCanvas 的大小并成功了。我在这里做错了什么?

编辑:如果我更改 drawImage 以获取原始图像作为参数,它会起作用

ctx.drawImage(image, 0, 0, newImageWidth, newImageHeight);

但我想使用旧画布,因为图像可能会被编辑,例如更改亮度。在画布上使用画布元素而不是图像元素不一样吗?

EDIT2:为了符合堆栈的溢出策略,我在这里问:以image为参数调用drawImage和以canvas为参数调用drawImage有区别吗?

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    是的,您可以使用图像元素或现有画布作为 drawImage 的图像源。

    您的问题是您使用的是可以剪辑而不是缩放的 drawImage 版本:

    // this clips newImageWidth X newImageHeight pixels from oldCanvas at x,y 
    
    ctx.drawImage(oldCanvas, x, y, newImageWidth, newImageHeight);
    

    改为使用 drawImage 的缩放版本:

    ctx.drawImage(oldCanvas,                    // use the old canvas as an image source
        0,0, oldCanvas.width,oldCanvas.height,  // use entire old canvas 
        x,y, newImageWidth, newImageHeight);    // scale that old canvas to the new size
    

    【讨论】:

    • 感谢您的回答。现在无法测试..将对其进行测试并回复您
    • 它不会像你描述的那样工作。我在 800x600 画布中间有一个 460x288 的图像。我这样做是为了测试:ctx.drawImage(oldCanvas, 0,0 oldCanvas.width, oldCanvas.height, 0, 0, 800, 600)。它应该重新缩放图像以适合整个画布,但事实并非如此。它只是不会做任何事情。它给了我初始图像。如果我使用 newImageHeight 和宽度(大于 460 和 288)图像看起来更小
    • 顺便说一句goo.gl/1mrTB3这篇文章在这里声明了这个9参数的drawImage方法用于裁剪,而另一个5参数用于缩放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2020-04-08
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多