<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <style> body { margin: 0px auto; background:url(https://kurage.ready.jp/img/w8b.gif); } table{ width:450px; margin:0 auto; background:#ffe; fline-height:130%; } td{ text-align:center; } #txtbd{ width:99%; background:#efe; } </style> </head> <body> <table border=0> <tr> <td colspan=2>画像転送→反転→URL出力→URL設定<hr></td> </tr> <tr> <td><img id="imgbd" src="../sample/mi12.jpg" width="80" height="100"></td> <td><canvas id="cvsbd" width="80" height="100" style="background: #eee;"></canvas></td> </tr> <tr> <td style="text-align: center;"><button id="imgtocvs" onClick="putImageToCanvas()" disabled="disabled">転送→</button></td> <td style="text-align: center;"> <button id="canvasUpset" onClick="canvasUpset()" disabled="disabled">反転</button> <button id="toDataURL" onClick="toDataURL()" disabled="disabled">URL出力 ↓</button></td> </tr> <tr> <td colspan="2" style="text-align: center;"><textarea id="txtbd" cols="48" rows="6"></textarea></td> </tr> <tr> <td style="text-align: center;"><button id="urltoimg" onClick="setURLtoImage()" disabled="disabled">↑ URL設定</button></td> <td> </td> </tr> </table> <script type="text/javascript"> var imgfg = document.getElementById('imgbd'); var cvs = document.getElementById('cvsbd'); var ctx; var txturl = document.getElementById('txtbd'); // CanvasとImageDataが利用可能ならボタン有効化 if (cvs.getContext && cvs.getContext('2d').createImageData) { document.getElementById('imgtocvs').disabled = false; document.getElementById('canvasUpset').disabled = false; document.getElementById('toDataURL').disabled = false; document.getElementById('urltoimg').disabled = false; ctx = cvs.getContext('2d'); } function putImageToCanvas() { // img要素からCanvasに画像を転送 ctx.drawImage(imgfg, 0, 0, cvs.width, cvs.height); } function canvasUpset() { // 上下反転 var canvasImageData = ctx.getImageData(0, 0, cvs.width, cvs.height); var canvasRGBA = canvasImageData.data; var newImageData = ctx.createImageData(cvs.width, cvs.height); var newRGBA = newImageData.data; // Canvasのピクセル情報を上下反転させながらコピー for (i = 0;i < cvs.height;i++) { for (j = 0;j < cvs.width;j++) { newRGBA[(j * 4) + ((cvs.height - 1 - i) * cvs.width * 4)] = canvasRGBA[(j * 4) + (i * cvs.width * 4)]; newRGBA[1 + (j * 4) + ((cvs.height - 1 - i) * cvs.width * 4)] = canvasRGBA[1 + (j * 4) + (i * cvs.width * 4)]; newRGBA[2 + (j * 4) + ((cvs.height - 1 - i) * cvs.width * 4)] = canvasRGBA[2 + (j * 4) + (i * cvs.width * 4)]; newRGBA[3 + (j * 4) + ((cvs.height - 1 - i) * cvs.width * 4)] = canvasRGBA[3 + (j * 4) + (i * cvs.width * 4)]; } } ctx.putImageData(newImageData, 0, 0); // コピーしたピクセル情報をCanvasに転送 } function toDataURL() { // Canvasの画像をURL(png文字列)化 txturl.value = cvs.toDataURL(); } function setURLtoImage() { // URLの画像をimg要素に設定 imgfg.src = txturl.value; } </script> </body> </html>
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>canvas face</title> <style type="text/css"> section{ display:flex; margin-left:70px; } #cvsbox,article{ text-align:center; margin:0 10px; } canvas,img{ border:1px solid #3d3; margin-bottom:10px; } #data_url_png, #data_url_jpeg{ width:500px; height:100px; overflow: auto; border:1px solid #333; background:#cfc; margin-bottom:17px; } </style> </head> <body> <div class="wrap00"> <section><article>--------<br> canvas <br>--------</article> <canvas id="cvsbox" width="140" height="100"></canvas> </section> ---png---<br> <img id="image_png" src="" width="140" height="100"/> <textarea id="data_url_png">png</textarea><br> ---jpeg---<br> <img id="image_jpeg" src="" width="140" height="100"/> <textarea id="data_url_jpeg">jpeg</textarea> <br> <button id="download_button">通常 img 保存</button> <a id="download_link" alt="ダウンロード用保存図リンク"></a> </div> <script> var downloadLink = document.getElementById('download_link'); var filename = 'your-filename.jpg'; // 通常保存ファイル名 var cvs = document.getElementById("cvsbox"); var ctx = cvs.getContext("2d"); // canvas に図形を描く ctx.fillStyle = '#dfe'; ctx.fillRect(10, 10, 120, 80); ctx.beginPath(); ctx.fillStyle = "#ed2"; ctx.arc(70,50,37,0,Math.PI*2,true); // 外の円 ctx.fill(); // 塗りつぶし ctx.beginPath(); // 新しいパスを開始 ctx.fillStyle = "#b11"; ctx.moveTo(77,55); ctx.arc(70,55,7,0,Math.PI*2,true); // 鼻 ctx.fill(); // 塗りつぶし ctx.beginPath(); // 新しいパスを開始 ctx.fillStyle = "#333"; ctx.moveTo(61,38); ctx.arc(55,38,5,0,Math.PI*2,true); // 左目 ctx.moveTo(91,38); ctx.arc(85,38,5,0,Math.PI*2,true); // 右目 ctx.fill(); // 塗りつぶし ctx.beginPath(); // 新しいパスを開始 ctx.lineWidth = 3; ctx.moveTo(70,75); ctx.arc(70,53,22,0.5*Math.PI,0.85*Math.PI,false); // 口 ctx.moveTo(70,75); ctx.arc(70,53,22,0.5*Math.PI,0.15*Math.PI,true); // 口 ctx.stroke(); // 線を引く // canvasの描画結果をpngでimg要素にセット try { var img_png_src = cvs.toDataURL(); document.getElementById("image_png").src = img_png_src; document.getElementById("data_url_png").firstChild.nodeValue = img_png_src; } catch(e) { document.getElementById("image_png").alt = "未対応"; } // canvasの描画結果をjpegでimg要素にセット try { var img_jpeg_src = cvs.toDataURL("image/jpeg",0.9); document.getElementById("image_jpeg").src = img_jpeg_src; document.getElementById("data_url_jpeg").firstChild.nodeValue = img_jpeg_src; } catch(e) { document.getElementById("image_jpeg").alt = "未対応"; } var button = document.getElementById('download_button'); // ボタン設定 button.addEventListener('click', function(){ // ダウンロード用設定 if (cvs.msToBlob) { // マイクロソフト対応用 var blob = cvs.msToBlob(); window.navigator.msSaveBlob(blob, filename); } else { // マイクロソフト以外用 // downloadLink.href = cvs.toDataURL('image/png'); downloadLink.href = cvs.toDataURL('image/jpeg'); downloadLink.download = filename; // img 保存するファイル名 downloadLink.click(); } }); </script> </body> </html>
( 1行目) この Webページは、HTML5 上で展開します
(16行目) canvas 領域を確保します
(19行目) ここに png形式の img要素を表示します
(20行目) ここに png画像の URL文字列(Base64)を表示します
(22行目) ここに jpeg形式の img要素を表示します
(23行目) ここに jpeg画像の URL文字列(Base64)を表示します
(26行目) 通常の img ダウンロード実行用のボタンを作成
(27行目) キャンバスを保存するときに必要な隠し要素です
(31行目) 隠し要素の参照です
(32行目) 通常保存 img ファイル名の指定です
(33行目) canvas の id 名(cvsbox)の要素を取得
(34行目) 該 2D(平面) Contextを取得
(36-60行) canvas 画像を描画します
(64行目) URL文字列(Base64)に変換します。(形式無指定→png)
(65行目) URL文字列(png)を img要素の src属性に指定します
(66行目) URL文字列(png)の内容を表示します
(68,76行) エラー時の処理
(72行目) URL文字列に変換。(形式→jpeg 品質レベル→0.9[無指定時 1])
(73行目) URL文字列(jpeg)を img要素の src属性に指定します
(74行目) URL文字列(jpeg)の内容を表示します
(79行目) ダウンロード実行ボタン要素の参照です
(80行目) ダウンロード実行ボタンクリック時の動作設定です
(16行目) canvas 領域を確保します
(19行目) ここに png形式の img要素を表示します
(20行目) ここに png画像の URL文字列(Base64)を表示します
(22行目) ここに jpeg形式の img要素を表示します
(23行目) ここに jpeg画像の URL文字列(Base64)を表示します
(26行目) 通常の img ダウンロード実行用のボタンを作成
(27行目) キャンバスを保存するときに必要な隠し要素です
(31行目) 隠し要素の参照です
(32行目) 通常保存 img ファイル名の指定です
(33行目) canvas の id 名(cvsbox)の要素を取得
(34行目) 該 2D(平面) Contextを取得
(36-60行) canvas 画像を描画します
(64行目) URL文字列(Base64)に変換します。(形式無指定→png)
(65行目) URL文字列(png)を img要素の src属性に指定します
(66行目) URL文字列(png)の内容を表示します
(68,76行) エラー時の処理
(72行目) URL文字列に変換。(形式→jpeg 品質レベル→0.9[無指定時 1])
(73行目) URL文字列(jpeg)を img要素の src属性に指定します
(74行目) URL文字列(jpeg)の内容を表示します
(79行目) ダウンロード実行ボタン要素の参照です
(80行目) ダウンロード実行ボタンクリック時の動作設定です