使用jQuery创建时,图像绘制拉伸到HTML Canvas

时间:2010-07-06 12:30:23

标签: jquery html5 canvas

考虑以下代码(包括jQuery):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src = "js/jquery-1.4.2.js"></script>
<script type="text/javascript">

jQuery(window).bind("load", function() {
    var elem = $("<canvas>", {width:300, height:300});

    var canvele = elem[0];


    var imm = new Image();

    imm.src = "card1/mask-x-6.png";
    imm.onload = function(){
        var ctx = canvele.getContext('2d');
        ctx.drawImage(imm, 0,0);
        $('body').append(elem);
    }
});


</script>
</head>
<body>

</body>
</html>

这将导致图像拉伸,而不是原始宽高比。在Firefox和Chrome上都有。为什么会这样?解决方法?


更新

道歉,如果我不使用jQuery生成canvas元素,这件事就不会发生。我也会把它发布到jQuery论坛。

1 个答案:

答案 0 :(得分:8)

HTML5 Canvas与HTML图像一样,具有内在大小 - 源图像中宽和高的像素数 - 以及显示大小 - 如何大,它在HTML页面上绘制。如果这两种尺寸设置不同,图像将被拉伸。

您用于创建canvas元素的jQuery代码通过设置CSS widthheight属性将 display 大小设置为300x300px,但不设置< em>内在大小不同于300x150的the default。因此,你绘制的任何东西都会拉伸两倍高。

要修复它,请直接设置canvas元素的实际widthheight属性。在下面的代码中我做了这个修复。我还修复了它以使用HTML5 DOCTYPE和我set the img.onload before the img.src

<!DOCTYPE html>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Setting Canvas Dimensions</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js">
</script>
<script type="text/javascript">
$(function(){
  var elem = $("<canvas>", {width:300, height:300});
  var canvele = elem[0];
  canvele.width = canvele.height = 300;

  var imm = new Image;
  imm.onload = function(){
    var ctx = canvele.getContext('2d');
    ctx.drawImage(imm, 0,0);
    $('body').append(elem);
  };
  imm.src = "http://phrogz.net/tmp/gkhead.jpg";
});
</script>
</head><body></body></html>