{"id":4192,"date":"2022-03-18T00:00:20","date_gmt":"2022-03-18T00:00:20","guid":{"rendered":"https:\/\/code-boxx.com\/?p=4192"},"modified":"2023-06-15T06:02:42","modified_gmt":"2023-06-15T06:02:42","slug":"download-canvas-image-javascript","status":"publish","type":"post","link":"https:\/\/code-boxx.com\/download-canvas-image-javascript\/","title":{"rendered":"Download HTML Canvas As Image In Javascript (Simple Example)"},"content":{"rendered":"<p>Welcome to a quick tutorial and example on how to download an HTML canvas as an image in Javascript. So you have an HTML canvas that you want to offer as a download &#8211; No problem, we can do that with a few lines of code.<\/p>\n<div class=\"sec-head answer\">\n<p>To download a canvas as an image file in Javascript:<\/p>\n<ul>\n<li><code>var canvas = document.getElementById(\"CANVAS ID\");<\/code><\/li>\n<li><code>var anchor = document.createElement(\"a\");<\/code><\/li>\n<li><code>anchor.href = canvas.toDataURL(\"image\/png\");<\/code><\/li>\n<li><code>anchor.download = \"IMAGE.PNG\";<\/code><\/li>\n<li><code>anchor.click();<\/code><\/li>\n<\/ul>\n<\/div>\n<p>That covers the quick basics, but take note that forcibly clicking on the download link with Javascript may not always work. Read on if you need a detailed example!<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ezoic-pub-ad-placeholder-101\"><\/div>\n<p>&nbsp;<\/p>\n<h2 class=\"in-head-d\">TLDR &#8211; QUICK SLIDES<\/h2>\n<p>[web_stories_embed url=&#8221;https:\/\/code-boxx.com\/web-stories\/download-canvas-image-javascript\/&#8221; title=&#8221;Download Canvas As Image In Javascript&#8221; poster=&#8221;https:\/\/code-boxx.com\/wp-content\/uploads\/2021\/11\/STORY-JS-20230518.webp&#8221; width=&#8221;360&#8243; height=&#8221;600&#8243; align=&#8221;center&#8221;]<\/p>\n<p style=\"text-align: center;\">Fullscreen Mode &#8211; <a href=\"https:\/\/code-boxx.com\/web-stories\/download-canvas-image-javascript\/\" target=\"_blank\" rel=\"noopener\">Click Here<\/a><\/p>\n<p>&nbsp;<\/p>\n<h2 class=\"in-head-d\">TABLE OF CONTENTS<\/h2>\n<div class=\"toc\">\n<div><a href=\"#sec-canvas\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-gear.svg\" width=\"36\" height=\"36\" \/>JS Download Canvas<\/a><\/div>\n<div><a href=\"#sec-download\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-download.svg\" width=\"36\" height=\"36\" \/>Download &amp; Notes<\/a><\/div>\n<div><a href=\"#sec-extra\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-plus-square.svg\" width=\"36\" height=\"36\" \/>Extra Bits &amp; Links<\/a><\/div>\n<div><a href=\"#sec-end\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-thumbs-up.svg\" width=\"36\" height=\"36\" \/>The End<\/a><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<div id=\"ezoic-pub-ad-placeholder-102\"><\/div>\n<p>&nbsp;<\/p>\n<div id=\"sec-canvas\" class=\"sec-head\" style=\"background: #e0f3ff;\">\n<h2 class=\"in-head-d\">DOWNLOAD CANVAS<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-gear.svg\" width=\"80\" height=\"80\" \/><\/p>\n<p>All right, let us now get into the example of how to download a canvas as an image.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">DOWNLOAD CANVAS DEMO<\/span><\/h3>\n<div class=\"code-example\"><canvas id=\"demo\" width=\"200\" height=\"200\"><\/canvas><br \/>\n<input id=\"demoA\" type=\"button\" value=\"JPG\" \/> <input id=\"demoB\" type=\"button\" value=\"PNG\" \/> <input id=\"demoC\" type=\"button\" value=\"GIF\" \/> <input id=\"demoD\" type=\"button\" value=\"WEBP\" \/><\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">STEP 1) CREATE A DUMMY CANVAS<\/span><\/h3>\n<div class=\"ref-head\">download.html<\/div>\n<pre><code>&lt;!-- (A) DRAW DUMMY CANVAS --&gt;\r\n&lt;canvas id=\"demo\" width=\"200\" height=\"200\"&gt;&lt;\/canvas&gt;\r\n&lt;script&gt;\r\nlet ctx = document.getElementById(\"demo\").getContext(\"2d\");\r\nctx.fillRect(30, 30, 50, 50);\r\nctx.fillRect(120, 30, 50, 50);\r\nctx.beginPath();\r\nctx.moveTo(10, 120);\r\nctx.bezierCurveTo(10, 180, 190, 180, 200, 120);\r\nctx.stroke();\r\n&lt;\/script&gt;<\/code><\/pre>\n<p>Well, nothing much to see here. Just generating a dummy &#8220;smiley face&#8221; on the HTML canvas.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ezoic-pub-ad-placeholder-103\"><\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">STEP 2) &#8220;FORCE&#8221; CANVAS DOWNLOAD<\/span><\/h3>\n<div class=\"ref-head\">download.html<\/div>\n<pre><code>&lt;!-- (B) GENERATE DOWNLOAD LINK --&gt;\r\n&lt;input type=\"button\" value=\"JPG\" onclick=\"candown('demo', 'jpg')\"&gt;\r\n&lt;input type=\"button\" value=\"PNG\" onclick=\"candown('demo', 'png')\"&gt;\r\n&lt;input type=\"button\" value=\"GIF\" onclick=\"candown('demo', 'gif')\"&gt;\r\n&lt;input type=\"button\" value=\"WEBP\" onclick=\"candown('demo', 'webp')\"&gt;\r\n&lt;script&gt;\r\nfunction candown (target, type) {\r\n  \/\/ (B1) GET CANVAS\r\n  let canvas = document.getElementById(target);\r\n \r\n   \/\/ (B2) CREATE LINK\r\n  let anchor = document.createElement(\"a\");\r\n  anchor.download = \"download.\" + type;\r\n  anchor.href = canvas.toDataURL(\"image\/\" + type);\r\n \r\n  \/\/ (B3) \"FORCE DOWNLOAD\"\r\n  anchor.click();\r\n  anchor.remove();\r\n \r\n  \/\/ (B4) SAFER ALTERNATIVE - LET USER CLICK ON LINK\r\n  \/\/ anchor.innerHTML = \"Download\";\r\n  \/\/ document.body.appendChild(anchor);\r\n}\r\n&lt;\/script&gt;<\/code><\/pre>\n<p>This is pretty much doing the same stuff in the introduction snippet, but packaged into a function for your convenience:<\/p>\n<ul>\n<li><strong>(B1)<\/strong> Get the HTML canvas.<\/li>\n<li><strong>(B2)<\/strong> We create an HTML anchor link in Javascript &#8211; <code>var anchor = document.createElement(\"a\")<\/code><\/li>\n<li><strong>(B2)<\/strong> Set the &#8220;download as&#8221; filename &#8211; <code>anchor.download = \"image.png\"<\/code><\/li>\n<li><strong>(B2)<\/strong> The magic happens when we do <code>anchor.href = canvas.toDataURL(MIME-TYPE)<\/code>. Yes, this sets a base 64 encoded data URL to it.<\/li>\n<li><strong>(B3)<\/strong> So-called &#8220;force download&#8221;. Take note, this trick may not work on all browsers &#8211; Some may not allow <code>click()<\/code> on a link due to security settings.<\/li>\n<li><strong>(B4)<\/strong> The safer way is to attach the download link to the page itself &#8211; <code>document.SOMEWHERE.appendChild(anchor)<\/code><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div id=\"ezoic-pub-ad-placeholder-106\"><\/div>\n<p>&nbsp;<\/p>\n<div id=\"sec-download\" class=\"sec-head\" style=\"background: #ffe8de;\">\n<h2 class=\"in-head-d\">DOWNLOAD &amp; NOTES<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-download.svg\" width=\"80\" height=\"80\" \/><\/p>\n<p>Here is the download link to the example code, so you don&#8217;t have to copy-paste everything.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">SORRY FOR THE ADS...<\/span><\/h3>\r\n<p>But someone has to pay the bills, and sponsors are paying for it. I insist on not turning Code Boxx into a \"paid scripts\" business, and I don't \"block people with Adblock\". Every little bit of support helps.<\/p>\r\n\r\n<p><a class=\"ast-button\" href=\"https:\/\/www.paypal.com\/paypalme\/wstoh\/5\" target=\"_blank\" rel=\"nofollow noopener\">Buy Me A Coffee<\/a> <a class=\"ast-button\" href=\"https:\/\/payhip.com\/codeboxx\" target=\"_blank\" rel=\"nofollow noopener\">Code Boxx eBooks<\/a><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">EXAMPLE CODE DOWNLOAD<\/span><\/h3>\n<p><a href=\"https:\/\/gist.github.com\/code-boxx\/9675e9275edd83f6675ac44b3045a2f9\" target=\"_blank\" rel=\"noopener noreferrer\">Click here for the source code on GitHub gist<\/a>, just click on &#8220;download zip&#8221; or do a git clone. I have released it under the MIT license, so feel free to build on top of it or use it in your own project.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"sec-extra\" class=\"sec-head\" style=\"background: #f8d5ff;\">\n<h2 class=\"in-head-d\">EXTRA BITS &amp; LINKS<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-plus-square.svg\" width=\"80\" height=\"80\" \/><\/p>\n<p>That&#8217;s all for the tutorial, and here is a small section on some extras and links that may be useful to you.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">COMPATIBILITY CHECKS<\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/caniuse.com\/canvas\" target=\"_blank\" rel=\"noopener\">Canvas<\/a> &#8211; CanIUse<\/li>\n<li><a href=\"https:\/\/caniuse.com\/mdn-api_htmlcanvaselement_todataurl\" target=\"_blank\" rel=\"noopener\">To Data URL<\/a> &#8211; CanIUse<\/li>\n<\/ul>\n<p>This example works on all modern browsers.<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">LINKS &amp; REFERENCES<\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTMLCanvasElement\/toDataURL\" target=\"_blank\" rel=\"noopener\">Canvas To Data URL<\/a> &#8211; MDN<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span style=\"color: #008000;\">INFOGRAPHIC CHEAT SHEET<\/span><\/h3>\n<figure style=\"width: 428px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2022\/03\/JS-download-canvas230615-R.webp\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2022\/03\/JS-download-canvas230615-sm-R.webp\" alt=\"\" width=\"428\" height=\"600\" \/><\/a><figcaption class=\"wp-caption-text\"><span style=\"font-size: 16px;\">Download Canvas As Image (Click To Enlarge)<\/span><\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<div id=\"sec-end\" class=\"sec-head\" style=\"background: #f1f1f1;\">\n<h2 class=\"in-head-d\">THE END<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2019\/08\/ico-thumbs-up.svg\" width=\"80\" height=\"80\" \/><\/p>\n<p>Thank you for reading, and we have come to the end. I hope that it has helped you to better understand, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!<\/p>\n<\/div>\n<p><script src=\"https:\/\/code-boxx.com\/wp-content\/uploads\/2022\/03\/js-dl-canvas.js\" defer async><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to a quick tutorial and example on how to download an HTML canvas as an image in Javascript. So you have an HTML canvas that you want to offer as a download &#8211; No problem, we can do that with a few lines of code. To download a canvas as an image file in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":20927,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[15],"tags":[],"class_list":["post-4192","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-js"],"_links":{"self":[{"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/posts\/4192"}],"collection":[{"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/comments?post=4192"}],"version-history":[{"count":0,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/posts\/4192\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/media\/20927"}],"wp:attachment":[{"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/media?parent=4192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/categories?post=4192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code-boxx.com\/wp-json\/wp\/v2\/tags?post=4192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}