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

got*_*ch4 3 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>
Run Code Online (Sandbox Code Playgroud)

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


更新

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

Phr*_*ogz 8

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

您用于创建canvas元素的jQuery代码通过设置CSS 和属性将显示大小设置为300x300px ,但不设置与默认值 300x150 不同的内在大小.因此,你绘制的任何东西都会拉伸两倍高.widthheight

要修复它,请直接设置canvas元素的实际widthheight属性.在下面的代码中我做了这个修复.我还修复它使用HTML5 DOCTYPE,我img.onload之前设置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>
Run Code Online (Sandbox Code Playgroud)