Html5: почему изображение рисуется на холсте не нужного размера

У меня проблема с рисованием изображения на холсте с нужным размером.

Это мой простой код:

        var canvas = document.getElementById('canvas'); 
        var context = canvas.getContext('2d');

        $(canvas).css('width', '100px');
        $(canvas).css('height', '75px');


        context.drawImage(img, 0, 0, 100, 75);

Я ожидаю, что изображение на холсте будет иметь ширину 100 и высоту 75. Результат не тот размер, а скорее меньший размер

как это:

Ожидаемый цветок в верхнем углу заполнит всю красную область. Кто-нибудь знает причину?

2 ответа

Решение

Когда вы сбрасываете размер холста с помощью CSS, вы просто "растягиваете" пиксели.

Таким образом, чтобы изменить количество пикселей на холсте, вы должны установить ширину и высоту элементов холста.

Пример кода и демоверсия: http://jsfiddle.net/m1erickson/G74zt/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var img=new Image();
    img.crossOrigin="anonymous";
    img.onload=start;
    img.src="https://dl.dropboxusercontent.com/u/139992952/stackru/house-icon.png";
    function start(){

        var ratio=calculateProportionalAspectRatio(
            img.width,img.height,canvas.width,canvas.height);

        ctx.drawImage(img,0,0,img.width*ratio,img.height*ratio);

    }

    // Calculate the ratio that fills the canvas
    // but doesn't stretch the image pixels
    // (This may cause some pixels to be clipped)
    function calculateProportionalAspectRatio(srcWidth, srcHeight, maxWidth, maxHeight) {
        return(Math.min(maxWidth / srcWidth, maxHeight / srcHeight));
    }


}); // end $(function(){});
</script>
</head>
<body>
    <h4>Original Image</h4>
    <img src="https://dl.dropboxusercontent.com/u/139992952/stackru/house-icon.png">
    <h4>Resize image proportionally to fill canvas</h4>
    <canvas id="canvas" width=350 height=350></canvas>
</body>
</html>

Изображение уже находится на холсте, когда javascript изменяет его размер, поэтому изображение наследует новый размер. Попробуйте изменить размер холста до нескольких произвольных начальных значений, например:

<img id="img" src="myimage.png">
<canvas id="canvas" height="750" width="1000">
<script>
var originalwidth=1000;
var originalheight=750;
var canvas = document.getElementById('canvas'); 
var context = canvas.getContext('2d');
var img=document.getElementById('img');
$(canvas).css('width', originalwidth/10);
$(canvas).css('height', originalheight/10);
context.drawImage(img,0,0,originalwidth,originalheight);
</script>

Это предполагает, что вы не можете установить начальный размер холста в HTML, что было бы предпочтительнее.

Другие вопросы по тегам