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

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

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

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

HTML5

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

7437閲覧

canvasで透過pngを重ねて一枚の画像にしたい

Nano422

総合スコア3

canvas

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

HTML5

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/08/16 08:10

編集2019/08/16 08:19

前提・実現したいこと

canvasで複数枚の透過pngを重ねて一枚の画像にしたいです(パーツごとに分かれているイメージ)

発生している問題

ボタンを押した地点で表示されるようにしているのですが、画像が透過されないです。ファイルはすべて透過で用意してある状態なのですが、うまく動作しません。一番最後に読み込まれた画像は一応表示されている状況です。

エラーなど

エラーは特に表立って吐いているわけではないので動作してはいるようです。

該当のソースコード

html

1<div id="canvas_box"> 2 <div id="c_container"> 3 <canvas id="canvas" width="960" height="540"> 4 <script> 5 var hair_src = "/static/img/hair/hair_1.png" 6 var eyebrow_src = "/static/img/eyebrow/eyebrow_1.png" 7 var eye_src = "/static/img/eye/eye_1.png" 8 var mouth_src = "/static/img/mouth/mouth_1.png" 9 var pose_src = "/static/img/pose/pose_1.png" 10 var effect_src = "/static/img/effect/effect_1.png" 11 var lettering_src = "/static/img/lettering/lettering_1.png" 12 var deco_src = "/static/img/deco/deco_1.png" 13 var skeleton_src = "/static/img/skeleton/skeleton.png" 14 15 function canvas() { 16 var container = document.getElementById("c_container"); 17 var canvas = document.getElementById("canvas"); 18 var context = canvas.getContext("2d"); 19 20 var source = [ 21 skeleton_src, 22 deco_src, 23 lettering_src, 24 effect_src, 25 pose_src, 26 mouth_src, 27 eye_src, 28 eyebrow_src, 29 hair_src 30 ]; 31 32 var images = []; 33 for (var i in source) { 34 images[i] = new Image(); 35 images[i].src = source[i]; 36 images[i].onload = function () { 37 context.drawImage(images[i], 0, 0); 38 } 39 } 40 } 41 </script> 42 </canvas> 43 </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

↓の直前で i を出力してみてください。多分、8が9回出力されると思います

JavaScript

1context.drawImage(images[i], 0, 0); 2

onloadが発火する時点でloopが最後まで回りきってるためです

iを引数として渡してみてください

images[i].onload = (function (index) { return function() { context.drawImage(images[index], 0, 0); } }(i));

投稿2019/08/16 08:40

編集2019/08/16 08:43
yxt003

総合スコア184

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

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

Nano422

2019/08/16 08:52

上手く動作しました!ありがとうございます! 回りきっているのが原因でしたか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問