<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <style type=''> html { font-family: helvetica, sans-serif; } canvas, img { margin: 10px; border: 1px solid grey; } .example { display: inline-block; width: 280px; margin-top: 50px; margin-right: 50px; } .title { text-align: center; } .description { width: 100%; } .description div { display: inline-block; text-align: center; font-size: 13px; } .description .source { width: 100px; } .description .target { width: 130px; } .example-title { text-align: center; font-size: 16px; } .error { color: red; } </style> <body> <h1 class="title">DrawImage canvas to canvas</h1> </body> <script type="text/javascript"> var smoothingEnabled = false; var examplesNum = 0; var imageSource = { width: 100, height: 100 }; var destCanvas = { width: 100, height: 100 }; // 2 arguments, the dest origin is 0,0 // The source canvas will copied to the 0,0 position of the destination canvas drawImage(0, 0); // 2 arguments, the dest origin is not 0,0 // The source canvas will copied to the 25, 25 position of the destination canvas drawImage(25, 25); // 4 arguments, the source origin is not 0,0, the dest size is provided // The source canvas will copied to the 50, 50 position of the destination canvas and // on an area of 50x50 pixels drawImage(50, 50, 50, 50); // 4 arguments, the dest origin is not 0,0 and the dest size is provided but // does not match the size of the source. The image will be distorted // The source canvas will copied to the 50,50 position of the destination canvas // and it will be shrunk to a and area of 25x25 drawImage(50, 50, 25, 25); // The source canvas will copied to the 50,50 position of the destination canvas // over an area of 50x25 pixels // The copied image will be distorted along the x axis drawImage(50, 50, 50, 25); // 8 arguments, both destination and source origins are 0, 0 // An area of 25x25 pixels of the source image will be copied to // an area of 25x25 pixels of the destination canvas drawImage(0, 0, 25, 25, 0, 0, 25, 25); // 8 arguments the destination origin is not 0,0 // An area of 25x25 pixels of the source image will be copied to // an area of 25x25 pixels of the destination canvas in the position 25,25 drawImage(0, 0, 25, 25, 25, 25, 25, 25); // The source rectangle overflows the source image // The source area is clipped to fit the source image // and the destination are is clipped in the same proportion drawImage(25, 25, 50, 50, 0, 0, 50, 50); // The destination rectangle has negative width and height // An exception is raised and nothing is drawn drawImage(25, 25, 50, 50, 0, 0, -100, -100); // The destination rectangle is larger thant the destination canvas // When the destination rectangle is outside the destination image (the scratch bitmap), the pixels // that land outside the scratch bitmap are discarded, as if the destination was an infinite canvas // whose rendering was clipped to the dimensions of the scratch bitmap. drawImage(0, 0, 50, 50, 0, 0, 200, 200); // The source rectangle is larger than the source canvas // The source area is clipped to fit the source image // and the destination are is clipped in the same proportion drawImage(0, 0, 100, 100, 0, 0, 50, 50); // Negative coorditanes of the source rectangle // The source area is clipped to fit the source image // and the destination are is clipped in the same proportion drawImage(-25, -25, 50, 50, 0, 0, 50, 50); // Example with non squared origin and source canvases imageSource = { width: 100, height: 50 }; destCanvas = { width: 100, height: 50 }; //drawImage(0, 0); function renderExample(title) { var container = document.createElement('div'); container.id = 'example' + examplesNum++; container.setAttribute('class', 'example'); var h2 = document.createElement('h2'); h2.textContent = title; h2.setAttribute('class', 'example-title'); container.appendChild(h2); var div1 = document.createElement('div'); var canvas1 = document.createElement('canvas'); var img = document.createElement('img'); img.src = 'rust-0.png'; div1.appendChild(img); div1.appendChild(canvas1); container.appendChild(div1); var div2 = document.createElement('div'); div2.setAttribute('class', 'description'); var source = document.createElement('div'); source.textContent = ' Source (' + imageSource.width + ',' + imageSource.height + ')'; source.setAttribute('class', 'source'); var arrow = document.createElement('div'); arrow.textContent = ' -> '; arrow.setAttribute('class', 'arrow'); var target = document.createElement('div'); target.textContent = 'Target (' + destCanvas.width + ',' + destCanvas.height + ')'; target.setAttribute('class', 'target'); div2.appendChild(source); div2.appendChild(arrow); div2.appendChild(target); container.appendChild(div2); return container; } function drawImage() { var args = Array.prototype.slice.call(arguments); var div = renderExample('drawImage(' + args.toString() + ')'); var canvas = div.querySelectorAll('canvas')[0]; var img = div.querySelectorAll('img')[0]; img.width = imageSource.width; img.height = imageSource.height; canvas.width = destCanvas.width; canvas.height = destCanvas.height; var ctx = canvas.getContext('2d'); ctx.fillStyle = "#FF0000"; ctx.fillRect(0, 0, destCanvas.width, destCanvas.height); ctx.imageSmoothingEnabled = smoothingEnabled; args.unshift(img); try { ctx.drawImage.apply(ctx, args); } catch(err) { var title = div.querySelector('.example-title'); var error = document.createElement('h2'); error.setAttribute('class', 'example-title error'); div.insertBefore(error, title); error.textContent += "Call Failed: " + err.message; } document.body.appendChild(div); } </script> </body> </html>