質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1948閲覧

自作のjavascriptメソッドのエラーが解決出来ない。

tkm0604

総合スコア555

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/12/07 08:46

編集2021/12/08 06:44

選択した画像を、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タグで描画したデータを画像に変換してデータベースに保存するにはどうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

js

1 //div id="image_area" を取得して、imgAreaに代入 2 let imgArea = document.getElementById(image_area); 3 4 //div id=imgArea内(let imgArea)に変数canvasImg(imgタグ)を追加 5 canvasImg.appendChild(imgArea);
  1. image_area という変数を定義していないので、暗黙的に id="image_area" を持つ要素が参照されます。
  2. getElementById() の引数は文字列なので、上の要素が文字列化されて getElementById() に渡されます。"[Object HTMLDivElement]" のようになるので、getElementById()null を返します。imgAreanull になります。
  3. appendChild()Node の引数が必要ですが、null が渡されたのでエラーとなります。

やりたかったことは下記のようなことでしょうか。

js

1 //div id="image_area" を取得して、imgAreaに代入 2 let imgArea = document.getElementById("image_area"); 3 4 //div id=imgArea内(let imgArea)に変数canvasImg(imgタグ)を追加 5 imgArea.appendChild(canvasImg);

あと、setAttribute() の使い方も間違ってますね。

投稿2021/12/08 06:48

int32_t

総合スコア21695

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkm0604

2021/12/08 06:55

コメントありがとうございます。getElementById();の引数には文字列で入れないといけなかたんですね。 (image_area という変数を定義していないので) setAttribute() の使い方に関して、複数の属性を追加する場合には分けて書く。 と認識していました。 もしよろしければ、今回のsetAttribute() の正しい使い方も教えてください。
int32_t

2021/12/08 07:01 編集

canvasImg.setAttribute = (属性名, 属性値); ではなく、 canvasImg.setAttribute(属性名, 属性値); です。
tkm0604

2021/12/08 07:03

ありがとうございます。 エラーが出ていなかったので、気づけませんでした。 ドキュメントを見返してもそのように書いていました、(ドキュメントみて書いたつもりだったのですが、、、気づけませんでした。)
tkm0604

2021/12/08 07:12

ありがとうございます。 まだ完全に思うような動作はしていませんが、おかげさまで少しずつ前進しております。 引き続きがんばります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問