Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML5 Canvas Image Scaling Issue

I am trying to make a pixel art themed game in HTML5 canvas, and as part of that I take 10x20 or so sized images and draw them onto the canvas with the following code:

ctx.drawImage(image, 20, 20, 100, 200);

However the canvas uses bicubic image scaling and hence the pixel art images look terrible at 2x and up. Is there a way to force canvas to use nearest neighbor scaling or possibly use a custom method to scale images? If not does that mean the images have to be scaled beforehand in something like Paint.net?

like image 470
dagronlund Avatar asked May 09 '12 22:05

dagronlund


People also ask

How do I fit an image into a canvas in HTML?

The following code compares the ratios and chooses to fit the image horizontally or vertically. var canvas = document. getElementById('canvas'); var context = canvas. getContext('2d'); var imageObj = new Image(); var fitImageOn = function(canvas, imageObj) { var imageAspectRatio = imageObj.

How do you get a picture to fit on canvas?

To quickly fit an image to your screen in Photoshop, go to View > Fit On Screen to fit your entire canvas to your screen. Alternatively, you can press Command + 0 (Mac) or Control + 0 (Windows) to fit your image to the screen instead.

Is HTML5 canvas still used?

The HTML5 canvas has the potential to become a staple of the web, enjoying ubiquitous browser and platform support in addition to widespread webpage support, as nearly 90% of websites have ported to HTML5.


1 Answers

Choose any one of the following:


Via JavaScript:

ctx.imageSmoothingEnabled = false;

Source: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-smoothing

On Gecko, you'll need

ctx.mozImageSmoothingEnabled = false;

Source: https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D#Gecko-specific_attributes

On Webkit, you'll need

ctx.webkitImageSmoothingEnabled = false;

Source: https://bugs.webkit.org/show_bug.cgi?id=82804

I couldn't find information on support of this property on other browsers, so they probably don't support it.


Via CSS:

Another option is to use a set of CSS rules on the canvas. For example:

<canvas id="c" width="16" height="16"></canvas>
<script>
  var c = document.getElementById("c"),
      cx = c.getContext("2d"),
      im = new Image();
  im.src = "http://stackoverflow.com/favicon.ico"; // 16x16
  cx.drawImage(im, 0, 0);
</script>
<style>
  canvas {
    width: 32px;
    height: 32px;
    image-rendering: optimizeSpeed;
    image-rendering: crisp-edges;
    image-rendering: -moz-crisp-edges;
    image-rendering: -o-crisp-edges;
    image-rendering: -webkit-optimize-contrast;
    -ms-interpolation-mode: nearest-neighbor;
  }
</style>

Source: https://developer.mozilla.org/en/CSS/image-rendering
Source: https://bugs.webkit.org/show_bug.cgi?id=56627


Via pixel routines:

Yet another option is to do it yourself using the canvas pixel manipulation routines: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#pixel-manipulation. That's a lot more work, though.

like image 130
Snowball Avatar answered Sep 23 '22 20:09

Snowball