X



Canvasについて語ろう
0004Name_Not_Found垢版2011/05/11(水) 23:28:01.80ID:???
そして誰も語らないのであった
===========完===========
0005じゃがりきん垢版2011/05/12(木) 03:17:51.04ID:???
語るにしてもcanvasについてより描画アルゴリズムについてだろうね
0006Name_Not_Found垢版2011/05/12(木) 09:46:32.29ID:???
そんな限定的な話題にしたらもっと廃れるぞw
0007Name_Not_Found垢版2011/05/12(木) 19:29:41.38ID:???
FAQっぽいものを充実させてください
  ┌──┐
┌┴┐  ├┐
│  ├┬┘│
│┌┴┤  │
└┤  └┬┘
  └──┘
こんなふうに長方形を重ねるのは無理です
とか
水平や垂直の直線や長方形で境界をくっきりさせるには0.5pxずらす
とか
0008Name_Not_Found垢版2011/05/12(木) 21:28:47.30ID:???
今やってる勉強が終わったらサンプル載せてってやるから待ってろ
0009Name_Not_Found垢版2011/05/13(金) 02:47:26.90ID:gp+6rMmV
※デフォルトでは読み込んだ画像のデータをputImageData()できません

これさえなけりゃ気合いで何でもありにできるのにな
0011Name_Not_Found垢版2011/05/20(金) 07:31:25.13ID:???
>7は普通に3次元空間では可能
つまりWebGLで板ポリでやればいい
あとその見た目にするだけなら2dでもできる
0013Name_Not_Found垢版2011/05/20(金) 10:12:50.37ID:???
と言ったものの
それは他のラスターグラフィックソフトも同じでcanvasだけが非力というわけではないか
0014Name_Not_Found垢版2011/05/20(金) 10:19:39.83ID:???
そういやgetContextの引数2dしかみたことないけど3dとかあるのかすら
0015Name_Not_Found垢版2011/05/20(金) 10:33:39.86ID:???
それぐらい日本語和訳みれば3dあるかどうかわかるだろ・・・
0018Name_Not_Found垢版2011/05/25(水) 02:55:01.09ID:???
w3cが言ってたwebGLの致命的な欠陥ってどうなったんだ?
なんとかしてくんなきゃ手が出せないぜ
0019Name_Not_Found垢版2011/05/25(水) 17:05:27.05ID:???
(x1,y1) (x2,y2) (x3,y3) (x4,y4)の各四点に四隅が一致した画像ファイルを貼付けるにはどうすればいいでしょうか。

対角線で二分割した三角形をそれぞれ三点に一致させるしかないのでしょうか?
0020Name_Not_Found垢版2011/05/28(土) 15:02:39.58ID:???
これモノクロにしたりするの時間かかるね
0023Name_Not_Found垢版2011/06/19(日) 09:27:50.28ID:???
そのうちフォトショとかシーケンサの代わりになるサイトが出るな
0025Name_Not_Found垢版2011/06/20(月) 04:26:00.53ID:???
>>24
特におもしろみもないフツーのものでした
0026Name_Not_Found垢版2011/06/20(月) 19:36:46.76ID:???
<body style="background-color:silver;">
<canvas id="canvas" width="500" height="500"></canvas>
<script>
var ctx = document.getElementById("canvas").getContext("2d");

ctx.fillStyle = "aqua";
ctx.fillRect(0, 0, 500, 500);

ctx.shadowColor = "blue";
ctx.shadowBlur = 100;

ctx.fillStyle = "lime";
ctx.fillRect(50, 50, 200, 200);

ctx.fillStyle = "red";
ctx.arc(250, 250, 150, 0, Math.PI * 2, true);
ctx.fill();

ctx.clearRect(150, 150, 200, 200);
</script>
</body>

赤い円の中を四角で切り抜いて
切り抜いた赤い円の内側(円の中心方向)にも影を付けるにはどうすればいいですか?
あと下の緑の四角と水色の四角も切り抜いた赤い円の内側から見えるようにしたいです
0027Name_Not_Found垢版2011/06/20(月) 19:54:00.38ID:???
>切り抜いた赤い円の内側(円の中心方向)にも影を付けるにはどうすればいいですか?
これがどういう意味かよくわかんなからそれ以外の部分だけ
http://ideone.com/AZtYY
0028Name_Not_Found垢版2011/06/20(月) 22:09:03.11ID:???
>>27
レスありがとうございます
キャンバス二枚用意するんですね

> >切り抜いた赤い円の内側(円の中心方向)にも影を付けるにはどうすればいいですか?
> これがどういう意味かよくわかんなからそれ以外の部分だけ
こういう意味です・・・伝わりますか

<body>
<canvas id="canvas" width="500" height="500"></canvas>
<script>
var ctx = document.getElementById("canvas").getContext("2d");
ctx.shadowColor = "red"; ctx.shadowBlur = 100;
ctx.fillStyle = "red";
ctx.arc(250, 250, 150, 0, Math.PI * 2, true); ctx.fill();
ctx.clearRect(150, 150, 200, 200);
ctx.shadowColor = "transparent"; ctx.shadowBlur = 0;
ctx.fillStyle = "aqua"; ctx.strokeStyle = "aqua";
ctx.beginPath(); ctx.moveTo(160, 130); ctx.lineTo(170, 140); ctx.moveTo(170, 130); ctx.lineTo(160, 140); ctx.stroke();
ctx.fillText("こっち側じゃなく", 180, 140);
ctx.fillStyle = "blue"; ctx.strokeStyle = "blue";
ctx.beginPath(); ctx.arc(165, 165, 5, 0, Math.PI * 2, true); ctx.stroke();
ctx.fillText("こっち側に", 180, 170); ctx.fillText("円の外側にある赤い影と", 180, 190); ctx.fillText("同じ影をつけたいです", 180, 210);
</script>
</body>
0029Name_Not_Found垢版2011/06/20(月) 23:18:16.12ID:???
切り抜き部分の透過はsave()、restore()使えばひとつのcanvasでできそうだけど無理かな
0030Name_Not_Found垢版2011/06/21(火) 08:12:07.57ID:???
>>28

var ctx = document.getElementById("canvas").getContext("2d");

ctx.shadowColor = "red";
ctx.shadowBlur = 100;
ctx.fillStyle = "red";

ctx.beginPath();
ctx.arc(250, 250, 150, 0, Math.PI * 2, false);
ctx.closePath();
ctx.moveTo(150, 150);
ctx.lineTo(150, 350);
ctx.lineTo(350, 350);
ctx.lineTo(350, 150);
ctx.closePath();

ctx.fill();
0031Name_Not_Found垢版2011/06/21(火) 08:25:56.10ID:???
rect()が時計回りに定義されてるから、円弧を反時計回りにして

ctx.beginPath();
ctx.arc(250, 250, 150, 0, Math.PI * 2, true);
ctx.closePath();
ctx.rect(150, 150, 200, 200);

とシンプルにもできる

clearRect()は普通何かを切り抜くのに使うんじゃないってのと、
時計回り、反時計回りって言ってる意味を調べてみるといい
0032Name_Not_Found垢版2011/06/21(火) 10:03:27.80ID:???
ctx.beginPath();
ctx.arc(250, 250, 150, 0, Math.PI * 2, true);
ctx.closePath();
だけを書くと赤い丸が表示されて
ctx.rect(150, 150, 200, 200);
だけ書くと赤い四角が表示されますが
何故両方書くと丸の中がくり貫かれて見えるようになるのですか?
0033Name_Not_Found垢版2011/06/21(火) 12:16:14.49ID:???
>>30-31
イメージ通りの結果です!ありがとうございますm(_ _)m

> clearRect()は普通何かを切り抜くのに使うんじゃないってのと、
まとめてパスを描いてからまとめてfillすれば切り抜かれるんですね
closePathされているとそれぞれ別個のものとして塗りつぶされるんだと思ってました
切り抜くのはclearRectだと思っていたので四角にしか切り抜けないんだとばかり
またはglobalCompositeOperationを使わないといけないのかなと

> 時計回り、反時計回りって言ってる意味を調べてみるといい
これはよくわかりませんでした
今回は右回りでも左回りでも結局一周して円を作るので同じ結果になると思っていました
が、ためしに>>30のほうをtrueに、>>31のほうをfalseにしてみると
たしかにうまく切り抜かれませんでした
どうしてこうなるのかわかりません
わかりませんが、これ聞いてなかったらまたハマるところでした
気を配っていただきありがとうございます
0034Name_Not_Found垢版2011/06/21(火) 21:54:49.21ID:???
> 時計回り、反時計回りって言ってる意味を調べてみるといい
これ理解できました
本当にどうもありがとうございます
0035Name_Not_Found垢版2011/06/23(木) 06:04:37.99ID:???
canvasで文字列を画像として出すのってどーやんの?
0037問題 垢版2011/06/24(金) 08:37:05.59ID:MN/NUHTR
中が塗りつぶされた五芒星を描画しなさい
0038Name_Not_Found垢版2011/06/24(金) 14:32:43.28ID:N6K/EDza
fillText("★", 0, 0);
0040Name_Not_Found垢版2011/06/26(日) 17:46:40.89ID:???
https://developer.mozilla.org/ja/Canvas_tutorial/Using_images#section_7
> 以下の例で外部画像を小さな折れ線のグラフ背景として使っています。
> 背景を使うと入念に背景を描く必要がないのでスクリプトがかなり小さくなる場合があります。
canvasで描けそうな場合でもあらかじめ画像を作っておいてdrawImageで読み込んだほうがいいんですか?
コードが短くなるというだけで速度とかは逆に遅くなる?
0041Name_Not_Found垢版2011/06/26(日) 19:16:56.95ID:???
canvasの例文wikiみたいなのやれば儲かるよ今ならね
0042Name_Not_Found垢版2011/06/26(日) 19:53:07.99ID:???
MDCでおk
html5.jpでおk
ってのが世間の風潮
0043Name_Not_Found垢版2011/06/26(日) 20:30:06.64ID:???
そこらは例文というか解説
俺もやろうか考えたけど面倒くさいからやってない
0044Name_Not_Found垢版2011/06/26(日) 20:37:34.08ID:???
ブログでゲームの作り方の解説はしたが
高度すぎたのか質問攻めにあって放置してるわ
ゲームテーマにして記事書くとありがたく思われるかもね
0046Name_Not_Found垢版2011/07/04(月) 03:41:28.75ID:???
canvasでsvg女子みたいに人体描画しようとした奴いる?
0047Name_Not_Found垢版2011/07/09(土) 03:09:59.27ID:FC9y0/mh
x,y,zを渡すと直方体を描画する関数を作成しなさい。
0048Name_Not_Found垢版2011/07/09(土) 09:38:40.15ID:???
        \  ヽ     ! |     /
     \    ヽ   ヽ       /    /       /
        お断りだああああああああああぁぁぁ!!
        \          |        /   /
                        ,イ
 ̄ --  = _           / |              --'''''''
          ,,,     ,r‐、λノ  ゙i、_,、ノゝ     -  ̄
              ゙l            ゙、_
              .j´ . .ハ_, ,_ハ   (.
    ─   _  ─ {    (゚ω゚ )   /─   _     ─
               ).  c/   ,つ   ,l~
              ´y  { ,、 {    <
               ゝ   lノ ヽ,)   ,
0049Name_Not_Found垢版2011/07/09(土) 15:17:54.54ID:1GO6b5xa
>47
それはどのレベルまでやるんだ?
簡易設計図みたいに遠近法もなしの線だけでできた直方体か?
遠近法や陰、グラデーションの光源処理までさせたいのなら角度や距離等他にも数値が欲しい
そしてWebGLでやる
0050Name_Not_Found垢版2011/07/10(日) 02:34:32.95ID:qPnf9h8H
直方体っぽくなればどんなのでもよしとします。
webGLはセキュリティー的になんかダメです。
canvasのみで作成しなさい。
0052Name_Not_Found垢版2011/07/19(火) 11:24:50.86ID:aL6/Iowt
Canvasって数値配列に直接対応するフレームバッファを持っていたりするから、レンダリングは全部ソフトウエアでやるんですよね?
CPUの中の妖精さんたちが、1ピクセルずつRGB値を計算する、みたいな・・・

やはり、アルファ値の指定や塗りつぶし系の処理は思いっきり遅くなるんでしょうか?
0053Name_Not_Found垢版2011/07/20(水) 21:23:47.90ID:???
>>52
大きい面積を塗りつぶすなどする場合はかなり遅くなると思います。
IE9だとFirefox5とかに比べて速いのでハードウェアアクセラレーションが効いているのかもしれません。
0054Name_Not_Found垢版2011/08/05(金) 19:47:31.04ID:???
ttp://www.ibm.com/developerworks/jp/web/library/wa-html5fundamentals4/
0056Name_Not_Found垢版2011/08/10(水) 07:10:03.17ID:???
>55
おもろい。
スライダー付けてリアルタイムで変化したらもっと(・∀・)イイ
005755垢版2011/08/11(木) 03:53:34.54ID:jFgZBwV8
それをやると無理やり変化させてるのがモロバレなんだぜ
0058Name_Not_Found垢版2011/08/11(木) 10:20:19.23ID:???
putImageData使えば、グラフィックソフト張りにいろいろできるじゃん、て思って実験してみました
作ってみたのは、ピクセル単位で任意のフィルタ処理するスクリプト

結論から言うと、JavaScriptの演算速度が遅過ぎて、現代の速度感覚にはあわないかと
環境はSafari 5.1、Xeon 2.27Ghz 8コア
500x500ピクセルのキャンバスを想定

・まず、ブラウザが1スレッドしか割り当ててくれない為、CPUの使用率は絶望的…1コアのみ処理が集中してるご様子
・単純な輝度の上げ下げだと、200msぐらい、ブラーフィルタだと幅1ピクセルでも500msぐらいから
・Web Workersではジョブ生成時にデータコピーを行うためか、明度を倍にするフィルタですら5秒ほどかかり、あまり期待できない感じ
・表示速度は問題なし。put後ラグなしで表示されます

正直なところ、キャンバスで動作する、任意のフィルタが使える画像処理アプリを作ってみたかったのですが、レスポンスなど考えると当面は無理そうです

JavaScriptの処理速度の底上げ、マルチスレッドの対応orGPU支援あたりだけど、あんまり期待が持てないなー
0059Name_Not_Found垢版2011/08/11(木) 13:30:49.46ID:5x2BmW3D
Workerの使い方が下手なだけ
0060Name_Not_Found垢版2011/08/11(木) 17:20:16.94ID:???
ふむ
とりあえず処理対象ピクセルのみピックするとして、10スレッドで割ってみると、上限は上がったけど頭打ちになります
メッセージのやりとりのオーバーヘッドが大きい、って所でしょうか大先生
0061Name_Not_Found垢版2011/08/12(金) 09:49:08.05ID:???
みんな似たようなこと考えてんな
火狐で緻密な描画するとブラクラ状態だったが火狐5にしたらオペラ・クローム並になったぜ
0062Name_Not_Found垢版2011/08/12(金) 19:56:50.79ID:HlaABMQT
IE9にしたらネイティブアプリ並になるよ
0063Name_Not_Found垢版2011/08/13(土) 14:28:19.22ID:???
いろいろ調べてた所、大きな数の添字アクセスって高コストなんですね
500x500px 4ch として、Image.data の中身は1,000,000要素の配列。
これを縦横分割して二次元配列とした配列に入れ直した場合とで、それぞれのピクセルに演算をする速度を比較したんだけど、
一次元配列の場合より二次元のほうが1/3の時間で済みます
二次元配列の、一次元目をローカル変数に置いて処理すると、1/10まで抑えられました

置き換えの処理速度は計算にいれてませんが、全取得して代入すると元より高くついちゃうので、分割してピクセル値を読み取る仕組みが必要ですね

そのあたりをうまくやれば改善できるかもです

IEは…今までの散々な歴史があるので、まずは当たり前の事を当たり前にこなしてくれれば、、;
0064Name_Not_Found垢版2011/08/22(月) 07:21:46.39ID:???
webGLに欠陥が見つかったとき、IEが対応させてもねーのに懸念を表明した時は何様だと思った
0065Name_Not_Found垢版2011/09/19(月) 14:21:43.65ID:9ce+ex7x
質問です
Canvas内に図面を書いているのですが、寸法を縦書きにする方法をお教えください。
「1000」という文字をそのまま90°回転させたものを1000毎に複数個並べたいのですが、
var rad = arc/180*Math.PI;
ctx.rotate(rad);
ctx.fillText(txt,X,Y,maxWidth);
こんな感じのことをすると、1個だけ表示されて、残りはどっかに飛んでいってしまっているようです。
回転する座標がなんかcanvasの左上にあるのかもしれません。
どなたかご存知でしたらお教えください。
0066Name_Not_Found垢版2011/09/19(月) 16:45:16.77ID:9ce+ex7x
自己解決しました
function arcTxt(ctx,txt,x,y,font,style,align,arc,maxWidth){
ctx.textAlign = align;
ctx.fillStyle = style;
ctx.font = font;
if(arc > 0){
var rad = -1*arc*Math.PI/180;
var rad2 = arc*Math.PI/180;
var exX2 = exX*Math.cos(rad2) - exY*Math.sin(rad2);
var exY2 = exX*Math.sin(rad2) + exY*Math.cos(rad2);
ctx.rotate(rad);
...つづく
0067Name_Not_Found垢版2011/09/19(月) 16:47:23.70ID:9ce+ex7x
つづき
ctx.fillText(txt,exX2,exY2,maxWidth);
ctx.rotate(rad2);
} else {
ctx.fillText(txt,exX,exY,maxWidth);
}
}
これで望んでいる位置に角度のついたテキストを配置できます。
やってる内容としては、rotateで回転した座標系上で逆回転させた座標を取得して、
そこにテキストを配置しているので、align等が望み通りにはできませんが.....
0068Name_Not_Found垢版2011/09/19(月) 22:15:07.54ID:9ce+ex7x
訂正
function arcTxt(ctx,txt,x,y...
のxとyをexXとexYに変えてください。
もしくは関数内のexXおよびexYを、xおよびyに変換してください。
失礼しました。
0069Name_Not_Found垢版2011/09/28(水) 08:17:12.72ID:???
2時間で自己解決する男の人って
0070Name_Not_Found垢版2011/09/30(金) 09:49:14.65ID:alH7YdbI
ザ他力本願
0074Name_Not_Found垢版2011/11/24(木) 18:23:40.46ID:vt5nE3zo
>>72
よく出来てるんだけど
ルールがいまいちわからん
0075Name_Not_Found垢版2011/12/30(金) 17:19:10.66ID:ioXxy4gO
保守
0077Name_Not_Found垢版2012/01/27(金) 19:54:11.54ID:x0agjE11
すげー!
と思ってコード見たら読みづれぇぇ!

これって、音ソースをbase64エンコードして
dataスキームで<audio>に食わしてる
であってる?
0078Name_Not_Found垢版2012/01/27(金) 20:11:58.90ID:WmaoenS6
100px*100pxサイズの画像を用意して
pieceSize=100;
Canvasで ctx.drawImage(img, 0, 0,pieceSize,pieceSize);

IEで見てもグーグルクロムで見ても描かれた画像の縦横比がおかしなことになりました。
縦が3で横が1.4くらいの比率で画像が表示されました。

ctx.setTransform(0.745, 0, 0, 0.374, 0, 0);
としたら何とか100px*100pxの画像になりました。

CanvasのdrawImageを使うとき何か注意が必要なのでしょうか?
Canvasを紹介しているサイトでは綺麗にピクセル単位で指定できると書いてあったので戸惑っています。
0079Name_Not_Found垢版2012/01/27(金) 20:22:20.03ID:???
>>78
面倒くさいから
そのままコピペして動けるものを一式張って
0080Name_Not_Found垢版2012/01/27(金) 20:51:13.81ID:WmaoenS6
ありがとございます。
http://ailinksh.kojyuro.com/minigame3/hosizoraTest.html
私のパソコンで見ると、画像の縦横比が3対1くらいで表示されてます。
未熟な私にソースのアドバイスお願いします。
0081Name_Not_Found垢版2012/01/27(金) 21:01:41.41ID:???
>>80
きめえコードだな
俺様が手直してしてやるからまってろ
0082Name_Not_Found垢版2012/01/27(金) 21:04:24.58ID:WmaoenS6
がーん、きめえ。
少し落ち込みました。
きちんとしたコードの書き方を習ったことがないので勉強になると思います。
期待して待っておきます。
どうもすいません。
0084Name_Not_Found垢版2012/01/28(土) 13:03:16.41ID:pMrvoosz
>83
あのページ開けませんけど?
とりあえず自己解決したので報告します。
styleのwidthとwidthの二つが別物だった。
ということでした、両者のサイズを同じにすれば問題ないようです。
解説サイトをよんで勉強したのですが基礎的なことなので解説サイトでは最初に書いててほしい気もします。
008576垢版2012/01/29(日) 10:00:22.18ID:cFqi6PkD
>>77
あってるぜ
waveヘッダー(コピペ)に配列くっつけてbase64エンコード(コピペ)して
dataスキームでaudioのsrcにぶっこんで鳴らしてるぜ
0086Name_Not_Found垢版2012/01/29(日) 20:13:29.81ID:???
画像を読み込んでCanvasに表示させると
2倍サイズの画像を使ってもぼやけちゃうんだけど
これはこういう仕様?
0087Name_Not_Found垢版2012/01/30(月) 06:01:12.34ID:f52eME2W
>>85
今すぐどうこうじゃないけど
そのうち音鳴らすことがあった時
パクっていい?
008885垢版2012/01/30(月) 07:34:04.91ID:???
いいぜ
0089Name_Not_Found垢版2012/01/30(月) 10:43:33.95ID:???
>>88
出来たらgithubにあげて有名人になってください
0091Name_Not_Found垢版2012/02/18(土) 09:19:47.71ID:BuZPd3bC
こっちにも貼ろうとしたら見つかってたぜー
0092Name_Not_Found垢版2012/02/19(日) 15:29:09.08ID:???
var image = document.createElement('img');
image.src = context.toDataURL()
で<img>化した画像に、適当な名前をつけたいんだが出来る?
保存させるときに名前付いてないのが困る
009392垢版2012/02/19(日) 15:31:53.49ID:???
cgiに画像名とdataURLを投げてファイル化して
srcに投入するって手はあるかもしれん
が、DOMのみで出来ればいいんだが・・・
連投失礼
0094Name_Not_Found垢版2012/02/19(日) 20:05:57.58ID:???
>>90

putImageDataで透過出来てるってどういうことなの・・・
0095Name_Not_Found垢版2012/02/20(月) 08:22:36.43ID:???
ちょっと違うけど簡単に書くとこうだぜ!

1 背景をput
2 aに全体をget
3 ボールのimageの.dataを1ピクセルごとに見て
ボールの位置のaの.dataを置き換える
4 aをput

1フレームで3回全体をとったりはったりしなきゃならない驚異の技だぜ!
0096Name_Not_Found垢版2012/02/23(木) 08:00:40.67ID:WvQzb7f8
concat()で.dataの高速複製ができたらいいんだけどな
0097Name_Not_Found垢版2012/02/23(木) 17:15:41.85ID:km5DjjGf
ピクセル単位で合成してたんだな
いつも

buffer = createElement('canvas');
g = this.buffer.getContext('2d');
g.fillRect(0,0,10,10);
ctx.drawImage(buffer,0,0,10,10,0,0);

てやって合成してたからputImageData使うなら軽く出来そう
長文スンマソン
0098Name_Not_Found垢版2012/02/24(金) 09:20:30.54ID:???
たぶん大量に透過させない限りcanvasの機能使ったほうが早いぜ〜
0099Name_Not_Found垢版2012/02/24(金) 20:59:55.35ID:g6KDZoBL
勉強になりやした
ぜ〜の人ありがとう
0100Name_Not_Found垢版2012/03/02(金) 09:12:22.68ID:???
canvasマリオがレベル高過ぎて吹いたぜー
ってかあれどうなってんの??
setTimeoutとか使ってないっぽいんだけど
レスを投稿する


ニューススポーツなんでも実況