選択した画像を、canvasタグでプレビュー。描画したデータを、画像に変換してデータベースに保存するコードをjavascript(Vue.js)で書いたのですが、canvasが画像に変換されません。
エラーが出ているのは、以下のメソッドです。
javascript
1 //canvasタグをimgタグに変換、name属性を'image'を追加するメソッド 2 saveCanvas: function (canvas_id) { 3 //canvasタグのidをlet canvasに代入 4 let canvas = document.getElementById(canvas_id); 5 6 //canvasをJPEG変換し、そのBase64文字列をlet urlへセット 7 let url = canvas.toDataURL("image/jpeg", 0.85); 8 9 // imgタグを作成し、canvasImgに代入 10 let canvasImg = document.createElement('img'); 11 12 //canvasImgにname属性、"image"をセット 13 canvasImg.setAttribute = ("name","image"); 14 15 //src属性に変数urlを代入し、canvasImgにセット 16 canvasImg.setAttribute = ("src",url); 17 18 //div id="image_area" を取得して、imgAreaに代入 19 let imgArea = document.getElementById(image_area); 20 21 //div id=imgArea 内(let imgArea)に変数canvasImg(imgタグ)を追加 22 //クリックされたらsaveCanvasメソッドを実行 23 imgArea.appendChild(canvasImg).click(); 24 },
canvasImg.appendChild(imgArea); の箇所で、「Uncaught TypeError: Cannot read properties of null (reading 'appendChild')」というエラーになります。。。。
Vueコンポーネント全体は以下のように書いています。
javascript
1<template> 2 <div> 3 <div id="image_area"> 4 <canvas ref="preview" id="preview"></canvas> 5 <input type="file" accept="image/*" ref="selectimage" @change="previewImage"/> 6 </div> 7 <p> 8 <input type="text" id="canvas_text" value="我輩は犬である" /> 9 <button type="button" @click="drawText('preview', 'canvas_text'),saveCanvas('preview')"> 10 文字を描く 11 </button> 12 </p> 13 </div> 14</template> 15 16<script> 17export default { 18 methods: { 19 // canvasの画像をinput type="file"にプレビュー 20 previewImage: function () { 21 let file = this.$refs.selectimage.files; //ファイル情報の取得 22 const canvas = this.$refs.preview; //canvasタグ 23 const fileReader = new FileReader(); 24 fileReader.onload = function () { 25 const ctx = canvas.getContext("2d"); 26 const image = new Image(); 27 image.src = fileReader.result; 28 image.onload = function () { 29 canvas.width = image.width; 30 canvas.height = image.height; 31 ctx.drawImage(image, 0, 0); 32 }; 33 }; 34 fileReader.readAsDataURL(file[0]); 35 }, 36 37 //キャンバスに文字を描く 38 drawText: function (canvas_id, text_id) { 39 const canvas = document.getElementById(canvas_id); 40 const ctx = canvas.getContext("2d"); 41 const text = document.getElementById(text_id); 42 //文字のスタイルを指定 43 ctx.font = "32px serif"; 44 ctx.fillStyle = "#404040"; 45 //文字の配置を指定(左上基準にしたければtop/leftだが、文字の中心座標を指定するのでcenter 46 ctx.textBaseline = "center"; 47 ctx.textAlign = "center"; 48 //座標を指定して文字を描く(座標は画像の中心に) 49 const x = canvas.width / 2; 50 const y = canvas.height / 2; 51 ctx.fillText(text.value, x, y); 52 }, 53 54 //canvasタグをimgタグに変換、name属性を'image'を追加するメソッド 55 saveCanvas: function (canvas_id) { 56 //canvasタグのidをlet canvasに代入 57 let canvas = document.getElementById(canvas_id); 58 59 //canvasをJPEG変換し、そのBase64文字列をlet urlへセット 60 let url = canvas.toDataURL("image/jpeg", 0.85); 61 62 // imgタグを作成し、canvasImgに代入 63 let canvasImg = document.createElement('img'); 64 65 //canvasImgにname属性、imageをcanvasImgにセット 66 canvasImg.setAttribute = ("name","image"); 67 68 //src属性に変数urlを代入し、canvasImgにセット 69 canvasImg.setAttribute = ("src",url); 70 71 //div id="image_area" を取得して、imgAreaに代入 72 let imgArea = document.getElementById(image_area); 73 74 //div id=imgArea内(let imgArea)に変数canvasImg(imgタグ)を追加 75 canvasImg.appendChild(imgArea); 76 77 //buttonタグをクリックした時にイベントを発生させる 78 canvasImg.click(); 79 }, 80 }, 81 82}; 83</script>
現状では、データ送信後画像ファイルが空になっています。
canvasタグで描画したデータを画像に変換してデータベースに保存するにはどうすればいいでしょうか?
回答1件
あなたの回答
tips
プレビュー