如何避免 HTML Canvas 自动拉伸

Posted

技术标签:

【中文标题】如何避免 HTML Canvas 自动拉伸【英文标题】:How to avoid HTML Canvas auto-stretching 【发布时间】:2011-02-22 22:30:17 【问题描述】:

我有以下 html

<style type="text/css">
    #cwidth:200px;height:500px
</style>
<canvas id="c"></canvas>
<script type="text/javascript">
    var i = new Image();
    i.onload = function () 
        var ctx = document.getElementById('c').getContext('2d');
        ctx.drawImage(i, 0, 0);
    
    i.width = i.height = 20; // actual size of square.png
    i.src = 'square.png';
</script>

问题是绘制的图像会自动按画布大小按比例拉伸(调整大小)。我已尝试使用所有可用参数 (drawImage(i, 0, 0, 20, 20, 0, 0, 20, 20)),但没有帮助。

是什么导致我的绘图拉伸,我该如何防止?

谢谢, 汤姆

【问题讨论】:

找到我的答案***.com/questions/2588181/… 将您的评论提升为真正的答案,以造福下一个前来寻找的人,我会给您一个 cookie(或点赞,无论我有什么)。 【参考方案1】:

您需要 canvas 元素中的 widthheight 属性。它们指定画布的坐标空间。显然,它默认为宽高比为 2:1 的画布,您的 CSS 会倾斜成正方形。

【讨论】:

【参考方案2】:

值得注意的是,canvas 的 Width 和 Height 属性 不是 像老派的 宽度和高度属性。它们不能替代 CSS。它们指定画布本身的像素缓冲区应该有多少像素,如果您不使用 css 对其应用大小,css 将暗示它的大小来自该像素缓冲区的形状。在 css 中设置元素的大小不会设置像素缓冲区的大小 - 它会调整它的大小。从 CSS 的角度来看, 完全一样。

【讨论】:

【参考方案3】:

好吧,比 JQuery 更简单(更轻)一点。当然是 JAVASCRIP 本身!

如果您需要动态更改画布尺寸,只需使用:

document.getElementById('yourcanvasid').setAttribute('width', aWidth);
document.getElementById('yourcanvasid').setAttribute('height', aHeight);

【讨论】:

document.getElementById('yourcanvasid').width = aWidth 也这样做【参考方案4】:

如果您使用的是 JQuery,则不应设置 CSS(如上面提到的评论者)。你需要这样设置属性:

$("canvas").attr('width', aWidth);
$("canvas").attr('height', aHeight);

效果很好。

【讨论】:

【参考方案5】:

我发现在我的动画循环中放置一个等待超时的while循环更容易,例如:

function animate() 
    c.clearRect(0, 0, window.innerWidth, window.innerHeight);
    ryuji.draw();
    ryuji.update();
    let now = Date.now();
    then = now + (1000 / fps);
    while (Date.now() < then) 

    
    requestAnimationFrame(animate);

【讨论】:

以上是关于如何避免 HTML Canvas 自动拉伸的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中的 NodeJs Azure Functions 上修复“错误:/home/site/wwwroot/node_modules/canvas/build/Release/canv

关于使用canvas画图时,图片被拉伸的问题

ThreeJS canvas画布自适应的原理

HTML5 Canvas 上的矩形被拉伸

新年第一个目标一张表盘串讲所有canves的知识点

canves基础自整理