【问题标题】:How the canvas manage the ratio of the image画布如何管理图像的比例
【发布时间】:2015-05-28 16:10:42
【问题描述】:

全部:

我想知道如果我在画布上绘制图像,如果图像比例不适合画布,画布如何缩放它(假设画布上只设置宽度和高度)?

例如:

<canvas id="myCanvas" style="width:200px; height:200px;"></canvas>
<script>
    var canvas = d3.select("#myCanvas").node();
    var context = canvas.getContext("2d");

    var img = new Image();

    img.onload = function(){
        console.log(img.naturalWidth, img.naturalHeight);
        context.drawImage(img, 0, 0);
    }

    img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>

结果似乎图像被垂直拉伸了一点,水平挤压了,我想知道为什么画布会这样处理它,以及如何按原样绘制或按比例缩放?

我也试过在画图的时候给出宽度和高度,但还是不太对,例如:

// in this way, the image still get stretched and squeeze
<script>
    var canvas = d3.select("#myCanvas").node();
    var context = canvas.getContext("2d");

    var img = new Image();

    img.onload = function(){
        console.log(img.naturalWidth, img.naturalHeight);
        context.drawImage(img, 0, 0, img.naturalWidth/5, img.naturalHeight/5);
    }

    img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>

// Even I give it a 100 by 100 size, it can not do it that way
<script>
    var canvas = d3.select("#myCanvas").node();
    var context = canvas.getContext("2d");

    var img = new Image();

    img.onload = function(){
        console.log(img.naturalWidth, img.naturalHeight);
        context.drawImage(img, 0, 0, 100, 100);
    }

    img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>

谢谢

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    画布的位图默认为 300x150,与 CSS 大小无关。

    <canvas id="myCanvas" style="width:200px; height:200px;"></canvas>
    

    这会将绘制到 300x150 位图的任何内容拉伸到适合 200x200 CSS 大小。

    使用画布的属性(或 JavaScript 中的属性)来正确设置大小:

    <canvas id="myCanvas" width=200 height=200></canvas>
    

    【讨论】:

    • 我试过这个,我有点困惑的是:画布如何处理不同格式的图像,因为当我尝试在画布上绘制jpeg或png图像时,它会拉伸图像填充整个区域,但是当我在画布上绘制 svg 时,它只会保持 svg 图像的原始大小(100 x 100)和比例,并为其余区域留下透明的空白空间。这是否意味着如果图像小于 300 x 150,它将保持原样并仅拉伸较大的图像?
    • @Kuan 如果使用宽度/高度参数,drawImage 将覆盖纵横比。您可以使用转换,f.ex。 context.scale(0.2, 0.2) 按比例缩小(仅使用 drawImage 的位置参数),或手动计算比率。对于前者,您需要对位置进行反向缩放(1/scale x X/Y)画布大小本身不会影响这一点,因为它只是生成的位图,但 CSS 大小除外,它会影响(最终结果) 比率。
    • 谢谢,不知道你能不能帮我处理一下这个代码jsfiddle.net/kuanslove/adntrecL我想做的是下载一个和svg一样的png,现在,只画了一半的图像(即使我已将宽度和高度指定为 300)。
    • @Kuan 我相信你需要使用结合宽度和高度的视图框(在 SVG 的情况下,样式将再次只影响元素,而不是位图或视图区域),看看这是否有帮助:webdesign.about.com/od/svg/a/svg-viewbox-attribute.htm。结果:jsfiddle.net/adntrecL/2
    • 谢谢,我会研究的。顺便说一句,你能告诉我为什么你认为是viewbox的原因的搜索过程,我发现我很难找到正确的方向来搜索答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2015-08-12
    • 2021-10-27
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多