最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Bad quality for 100% both width and height of canvas - Stack Overflow

programmeradmin10浏览0评论

I have done a very tiny example with canvas, it's available on JsFiddle:

/

<!DOCTYPE html>
<html>
    <head>
    <title></title>
    <style type="text/css">

    html, body {
        width: 100%;
        height: 100%;
        margin: 0px;
        padding: 0px;
    }

    #myCanvas {
        width: 100%;
        height: 100%;
        display: block;
    }

    </style>
    </head>
    <body>
        <canvas id="myCanvas">
            Your browser does not support the HTML5 canvas tag.
        </canvas>
        <script>

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

            context.id = "myContext";
            context.beginPath();
            context.arc( 95, 50, 40, 0, 2 * Math.PI );
            context.stroke();

            setTimeout( function() { 
                var rectWidth = 150;
                var rectHeight = 75;
                context.fillStyle = "blue";
                context.fillRect( rectWidth / -2, rectHeight / -2, rectWidth, rectHeight );
            }, 2000 );

        </script> 
    </body>
</html>

As you are able to see, the rendering result has a very low quality:

So, I'm wondering, how can I draw various figures using Canvas in a good quality, I don't want to draw in small size, I want to draw in 100% size of page.

So, maybe I didn't define some anti aliasing filter or something else?

Thanks!

I have done a very tiny example with canvas, it's available on JsFiddle:

http://jsfiddle.net/yPtr5/

<!DOCTYPE html>
<html>
    <head>
    <title></title>
    <style type="text/css">

    html, body {
        width: 100%;
        height: 100%;
        margin: 0px;
        padding: 0px;
    }

    #myCanvas {
        width: 100%;
        height: 100%;
        display: block;
    }

    </style>
    </head>
    <body>
        <canvas id="myCanvas">
            Your browser does not support the HTML5 canvas tag.
        </canvas>
        <script>

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

            context.id = "myContext";
            context.beginPath();
            context.arc( 95, 50, 40, 0, 2 * Math.PI );
            context.stroke();

            setTimeout( function() { 
                var rectWidth = 150;
                var rectHeight = 75;
                context.fillStyle = "blue";
                context.fillRect( rectWidth / -2, rectHeight / -2, rectWidth, rectHeight );
            }, 2000 );

        </script> 
    </body>
</html>

As you are able to see, the rendering result has a very low quality:

So, I'm wondering, how can I draw various figures using Canvas in a good quality, I don't want to draw in small size, I want to draw in 100% size of page.

So, maybe I didn't define some anti aliasing filter or something else?

Thanks!

Share Improve this question asked Feb 6, 2014 at 8:20 user2402179user2402179
Add a comment  | 

3 Answers 3

Reset to default 12

Problem

In most general cases we should avoid using CSS to set the canvas size.

The default size of canvas is 300 x 150 pixels (bitmap). If you set the size using CSS we'll just end up scaling those 300 x 150 pixels meaning the browser will start interpolating and smoothing the image, which is why you end up with a blurry result.

Solution

Remove these from the CSS-rule:

#myCanvas {
  /*width: 100%;
  height: 100%;*/
  display: block;
  }

and set the size in JavaScript like this:

var canvas = document.getElementById( "myCanvas" );

canvas.width = window.innerWidth;     // equals window dimension
canvas.height = window.innerHeight;

You can of course set any other size you need (in pixels). You probably want to define position (i.e. fixed or absolute) for the canvas' CSS as well if your goal is full window size.

Hope this helps.

The height and width need to be set on the height and width attributes of the canvas tag and not in CSS. Any CSS sizing of the canvas element merely stretches the canvas and does not size it properly.

<canvas id="canvas" width="500px" height="500px">

Have a look at this project that I posted on my site: Creating an HTML5 Paint App

It includes a functionto resize the canvas when the browser window size changes (which you would have to modify):

        this.onScreenSizeChanged = function (forceResize) {
        if (forceResize || (this.canvas.width != window.innerWidth /*|| 
                            this.canvas.height != window.innerHeight*/)) {

            var image = this.context.getImageData(0, 0,
                    this.canvas.width, this.canvas.height);

            this.canvas.width = (window.innerWidth);
            this.canvas.height = (window.innerHeight);

            this.context.putImageData(image, 0, 0);

        }
    }
    this.onScreenSizeChanged(true);

In my case, it was a problem with the screen pixel ratio. To solve it, I created a canvas with a higher pixel ratio as follows:

function createHiPPICanvas(w, h) {
    let ratio = window.devicePixelRatio;
    let cv = document.createElement("canvas");
    cv.width = w * ratio;
    cv.height = h * ratio;
    cv.style.width = w + "px";
    cv.style.height = h + "px";
    cv.getContext("2d").scale(ratio, ratio);
    return cv;
}

Then I also increased accordingly the pixel ratio of the images used inside of the canvas.

发布评论

评论列表(0)

  1. 暂无评论