\r\n```","answerCount":2,"upvoteCount":0,"datePublished":"2019-05-02T08:37:37.448Z","dateModified":"2019-05-02T08:42:34.142Z","acceptedAnswer":{"@type":"Answer","text":"自己解決しましたので、解決方法を記載します。\r\nまず、`this.src`としていましたが、`this.img.src`の間違いでした。また、この行の記載位置も`new Image()`の後に書かなければいけませんでした。\r\nこれで、`onload`はできたのですが、この中の`this.ctx`でエラーが表示されました。これは、`this`の参照が間違っていたからだと思います。`mounted`の最初に`this`を変数に代入することで、すべて解決できました。\r\n以下に修正部分の全コードを記載します。どなたかのお役に立てば幸いです。\r\n```html\r\n\r\n```","dateModified":"2019-05-02T09:38:38.746Z","datePublished":"2019-05-02T09:38:38.746Z","upvoteCount":2,"url":"https://teratail.com/questions/187415#reply-278328"},"suggestedAnswer":[{"@type":"Answer","text":"参考なりました。\r\n自分の場合はwidthとかの記述追加しました。\r\n\r\n\r\n```\r\nlet self = this\r\nself.canvas = self.$refs.canRef\r\nself.ctx = self.canvas.getContext('2d')\r\n\r\nself.img = new Image()\r\nself.img.src = '/camera.jpg'\r\nself.img.onload = function() {\r\n console.log('loaded')\r\n // here\r\n self.ctx.canvas.width = window.innerWidth;\r\n self.ctx.canvas.height = window.innerHeight;\r\n self.ctx.drawImage(self.img, 0, 0);\r\n}\r\n```","dateModified":"2020-06-23T05:59:51.508Z","datePublished":"2020-06-23T05:59:51.508Z","upvoteCount":0,"url":"https://teratail.com/questions/187415#reply-388541","comment":[]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/canvas","name":"canvasに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/187415","name":"Vue.js:Vueアプリケーション内のCanvas要素に画像を表示させたい"}}]}}}
質問するログイン新規登録

Q&A

解決済

2回答

4088閲覧

Vue.js:Vueアプリケーション内のCanvas要素に画像を表示させたい

tara-tail

総合スコア32

canvas

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

Vue.js

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2019/05/02 08:37

編集2019/05/02 08:42

0

0

前提・実現したいこと

Vueアプリケーション内にCanvasタグを設置して、描画のテストをしています。
そのCanvas内に、fillRect()などで図を描画することはできました。次に、そのCanvas内にPNG画像を配置したいと考えています。

発生している問題

すでにアップロードしてある画像データ(imgフォルダ内)をCanvas描画させようとしているのですが、以下のコードでは描画されません。
onload内のコンソールログが表示されないので、ここの記載が間違っているようです。
どうか、ご教示のほど、よろしくお願いします。
※HTML、bodyタグなどは省略しています。

html

1<div id="app"> 2 <canvas id="canvas" width="320" height="320" ref="canRef"></canvas> 3<div> 4 5<script> 6 new Vue({ 7 el: '#app', 8 data: { 9 canvas: null, 10 ctx: null, 11 img: null, 12 src: null 13 }, 14 mounted: function() { 15 this.canvas = this.$refs.canRef 16 this.ctx = this.canvas.getContext('2d') 17 this.src = 'img/tomato.png' 18 this.img = new Image() 19 this.img.onload = function() { 20 console.log('loaded') 21 this.ctx.drawImage(this.img, 0, 0); 22 } 23 } 24 }) 25</script>

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しましたので、解決方法を記載します。
まず、this.srcとしていましたが、this.img.srcの間違いでした。また、この行の記載位置もnew Image()の後に書かなければいけませんでした。
これで、onloadはできたのですが、この中のthis.ctxでエラーが表示されました。これは、thisの参照が間違っていたからだと思います。mountedの最初にthisを変数に代入することで、すべて解決できました。
以下に修正部分の全コードを記載します。どなたかのお役に立てば幸いです。

html

1<script> 2 new Vue({ 3 el: '#app', 4 data: { 5 canvas: null, 6 ctx: null, 7 img: null 8 // srcを削除 9 }, 10 mounted: function() { 11 let self = this // thisを変数に代入 12 self.canvas = self.$refs.canRef 13 self.ctx = self.canvas.getContext('2d') 14 // srcの前にself.imgをつけて、new Image()の後に移動 15 self.img = new Image() 16 self.img.src = 'img/tomato.png' 17 self.img.onload = function() { 18 console.log('loaded') 19 // thisをselfに代入したことで、エラーが出ない 20 self.ctx.drawImage(self.img, 0, 0); 21 } 22 } 23 }) 24</script>

投稿2019/05/02 09:38

tara-tail

総合スコア32

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

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

0

参考なりました。
自分の場合はwidthとかの記述追加しました。

let self = this self.canvas = self.$refs.canRef self.ctx = self.canvas.getContext('2d') self.img = new Image() self.img.src = '/camera.jpg' self.img.onload = function() { console.log('loaded') // here self.ctx.canvas.width = window.innerWidth; self.ctx.canvas.height = window.innerHeight; self.ctx.drawImage(self.img, 0, 0); }

投稿2020/06/23 05:59

miyamoto0105

総合スコア216

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問