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

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

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

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

HTML5

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

JavaScript

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

Q&A

解決済

2回答

12030閲覧

HTML5 Canvas に画像をオブジェクトとして表示したい

Tats.N

総合スコア62

canvas

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

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2016/11/04 00:41

編集2016/11/04 06:50

こんにちは。いつもありがとうございます。最近Canvasを使う機会がありまして勉強中です。

##エラーが出ます
Canvas に画像をオブジェクトとして表示しようと、下のコード実行すると、

JavaScript

1window.onload = function () { 2 var treeArray = []; 3 4 ctx = document.getElementById('canvas').getContext('2d'); 5 for(var i = 0; i < 5; i++){ 6 treeArray.push(new Tree("../assets/images/tree.png",i*100,i*100)) 7 treeArray[i].draw(); 8 } 9}//Close window event listener 10 11function Tree(imgURL,imgWidth,imgHeight){ 12 this.img = new Image; 13 this.img.width = imgWidth; 14 this.img.height = imgHeight; 15 this.img.src = imgURL; 16 this.translate = { 17 x : (window.innerWidth - this.img.width)/2, 18 y : (window.innerHeight - this.img.height)/2 19 } 20} 21 22Tree.prototype.draw = function(){ 23 this.img.addEventListener("load", function(){ 24 ctx.drawImage(this.img,0, 0); 25 }, false) 26} 27 28function reset() { 29 location.reload(); 30}

Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap)' at HTMLImageElement.<anonymous>

このエラーが出ます。
しかし、オブジェクトとして表示しなければ普通に表示されます。何が間違っていますか??わかる方おられましたら教えてください。お願いします。

###追記
オブジェクトとして表示しなかった場合のコードです。

JavaScript

1var imgTest; 2 3 4window.onload = function () { 5 var treeArray = []; 6 imgTest = new Image; 7 imgTest.src = "../assets/images/test.png" 8 ctx = document.getElementById('canvas').getContext('2d'); 9 imgTest.onload = function(){ 10 ctx.drawImage(imgTest, 0, 0); 11 } 12} 13}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/11/04 01:55

ところどことで使っている this は何を意図していますか? 「オブジェクトとして表示しなければ」とは具体的にどうしているのですか?
kei344

2016/11/04 02:04

「オブジェクトとして表示しなければ」のコードも質問文に追記ください。
guest

回答2

0

ベストアンサー

このaddEventListenerに渡した関数の中でthisを使っていますが、このthisTreeのインスタンスを差していません。なのでthis.imgundefinedとなり、質問者様の言うようなエラーが発生します。

JavaScript

1Tree.prototype.draw = function(){ 2 this.img.addEventListener("load", function(){ 3 ctx.drawImage(this.img,0, 0); 4 }, false) 5}

これの対処法はいくつかありますが、簡単なものはFunction.prototype.bindメソッドを使って、関数の中のthisを固定することです。具体的には次のように書き直します。

JavaScript

1Tree.prototype.draw = function(){ 2 this.img.addEventListener("load", function(){ 3 ctx.drawImage(this.img,0, 0); 4 }.bind(this), false) 5 // ^---- ここでbindを使ってthisを固定している 6}

これで期待通りに動くかと思います。


参考

投稿2016/11/04 02:29

MakeNowJust

総合スコア545

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

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

Tats.N

2016/11/08 00:40

ありがとうございます。思った通りに表示できました。
guest

0

JavaScript

1Tree.prototype.draw = function(){ 2 this.img.addEventListener("load", function(e){ 3 ctx.drawImage(e.target,0, 0); 4 }, false) 5}

とか。

投稿2016/11/04 06:55

kei344

総合スコア69407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問