Canvasについて語ろう

このエントリーをはてなブックマークに追加
259Name_Not_Found:2014/02/08(土) 12:22:17.39 ID:???
等倍で読み込む→getImageData→自前縮小→put
260Name_Not_Found:2014/02/08(土) 23:44:34.82 ID:???
>>259
レスありがとうございます。
canvasの drawImage() を使ってリサイズせずに、
別の方法で画像をリサイズしてからcanvasにはリサイズ後の画像を等倍で描画しろ、ってことですね。

自前でリサイズ処理を実装するのが難しそうだ…。
ブラウザのcanvas実装が進化して、綺麗にリサイズできるようになる日が来るのを待ちますw
261Name_Not_Found:2014/02/09(日) 16:41:57.72 ID:???
drawImage()で縮小する方法として、
「いったん目的の画像と元画像の中間の大きさの画像を生成する」
っていう段階的にリサイズする手があるみたいですね。
ジャギー発生の条件が「画像の縮小率が 50% を下回る」ということらしいので、
段階的に縮小して50%を下回らないようにすればジャギらないようです。

Canvas drawImage() で画像を縮めすぎるとギザギザする問題を解消する
http://jsdo.it/21f/nvIM
262Name_Not_Found:2014/02/11(火) 09:37:58.89 ID:4E0HsFuc
そもそも50%以下でジャギるって仕様はどうなってんだ
バイリニア(周囲4マスしか参照しない)か?
263Name_Not_Found:2014/02/12(水) 15:51:06.92 ID:???
画像を円形にくり抜くのって出来ないの?
264Name_Not_Found:2014/02/16(日) 13:26:34.72 ID:???
円形の画像ギャラリー
http://jsdo.it/obomemo/obr0
265じゃがりきん:2014/03/15(土) 16:06:12.32 ID:61UnCATO
久々の自信作だぜ〜


ベルベットフレア
http://jsdo.it/jagarikin/zCfZ
266Name_Not_Found:2014/03/17(月) 18:29:00.18 ID:9eq4Z8up
>>265
ザックリしか見てないけど
function ruup()などの関数名がイカス
267Name_Not_Found:2014/03/19(水) 22:16:35.80 ID:???
読めるソースになってるw
268Name_Not_Found:2014/03/23(日) 15:46:24.23 ID:ykVxlW4K
詳しい方、おしえてください。当方、canvas初心者です。

canvasに4つの四角を描くプログラムを書いたのですが、
なぜか、4つめの枠線が薄くなります。

ソースコードを以下に上げたので、ご教示ください。m(_ _)m

ttp://sandbox323.wiki.fc2.com/wiki/canvas-test
269Name_Not_Found:2014/03/23(日) 19:27:33.78 ID:???
stroke()はrect()呼び出した後に毎回呼び出さず、最後に一回だけ呼び出せばいい
270Name_Not_Found:2014/03/23(日) 20:12:22.08 ID:???
>>269
レスありがとうございます。

/* 四角を描く */
ctx.strokeStyle = 'rgb(255, 0, 0)'; //赤
for ( var key in coordinates ) {
ctx.rect( coordinates[key].x, coordinates[key].y, 25, 25);
}
ctx.stroke();

としてみたら、4つとも同じ色の枠線になったのですが、
なぜか少し薄い赤です。

それで、当てずっぽうですが、

/* 四角を描く */
ctx.strokeStyle = 'rgb(255, 0, 0)'; //赤
for ( var key in coordinates ) {
ctx.rect( coordinates[key].x, coordinates[key].y, 25, 25);
}
ctx.stroke();
ctx.stroke();

とstroke()を2回繰り返したら、4つとも普通の赤になりました。

自分のブラウザ(chrome最新版)がおかしいんでしょうか?
271Name_Not_Found:2014/08/01(金) 21:21:33.37 ID:rp6Y6Wdn
Canvas Fingerprintingはクッキーより怖いのか技術的に調べてみた
ttp://techracho.bpsinc.jp/morimorihoge/2014_07_29/18555
272Name_Not_Found:2014/11/13(木) 11:21:34.25 ID:???
http://jsdo.it/jagarikin/t4Rm
じゃがりきん新作hage
273Name_Not_Found:2015/02/17(火) 18:46:25.11 ID:???
幾何学の図形を描くのにCanvasは適していますか。
他にHTMLドキュメントで表現できる方法はありますか。
SVGのほうが最適でしょうか。
274Name_Not_Found:2015/02/18(水) 02:18:21.48 ID:???
用途による
275Name_Not_Found:2015/02/18(水) 09:35:34.76 ID:???
SVGのほうはHTMLと同じDOM操作で描くというより組み立てる感じに近い

fabric.jsってライブラリがcanvasとsvg両方に対応してる
276Name_Not_Found:2015/02/18(水) 10:47:52.39 ID:???
SVGの最大の強みはスケーリング変えても画質の損失が無い事、
画像の要素の一部を移動や拡大とかだとその属性の変更で済んでしまう事

canvasの場合全面書き換えする必要がある

あとSVGはIllustratorやInkscapeなどを使用して事前に作成(外部ファイル化)が可能

難点といえば複雑な図形では描画に少し時間がかかる点か?
しかしこれはcanvasも似たようなものか

どちらもjpegやpngなどラスター画像を組み込む事も出来るので全てを描画する必要は無い
277273:2015/02/18(水) 18:24:02.09 ID:???
>>274-276
教えてくださってどうも有難うございました。
たいへん参考になりました。
とりあえずinkscapeを使って描き、SVGで出力する方法でやってみます。
278Name_Not_Found:2015/02/18(水) 18:39:27.09 ID:???
arcメソッドを使う場合はbeginPathもclosePathもいらないと思うんですが、使う理由は何ですか?
arcメソッドってパス関係ないと思うんですけど。
ほとんどのサンプルコードには使われているんですがこれらは間違っていると思うんです
279Name_Not_Found:2015/02/18(水) 19:01:57.68 ID:???
>>278
ここのサンプル眺めてればなんとなく理由がわかると思う
https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes
280Name_Not_Found:2015/02/18(水) 19:04:55.07 ID:???
moveToでサブパスが発生するから
281Name_Not_Found:2015/02/18(水) 20:40:00.31 ID:???
arcだけしか使わない場合ならmoveToは不要だと思うんですよ
282Name_Not_Found:2015/02/18(水) 20:40:43.54 ID:???
>>279
注意: fill メソッドがと呼ばれるときはどんな開いている図形は自動的に閉じられ、 closePath メソッドを使う必要はありません。

なるほど
283Name_Not_Found:2015/02/18(水) 20:41:55.38 ID:???
arcで複数の円を作る場合ならmoveToはいらないという話です
矩形やlineToなどを使う場合は別です
284Name_Not_Found:2015/02/18(水) 20:52:23.53 ID:???
fillやstroke、closePathを呼び出すまでarcを複数回呼び出した場合、それは1つのパス、って事
285Name_Not_Found:2015/02/18(水) 23:23:10.78 ID:???
真円ならいらないね
弧だけなら線と組み合わせる場合があるからいる
286Name_Not_Found:2015/02/19(木) 09:17:47.89 ID:???
moveToが要る要らないじゃなくて、要るとき底辺コーダーが罠に嵌らないように、ご丁寧にそういうサンプルコードが書かれてるんだよ
で、そのサンプルが伝播して『ほとんどのサンプルコードには使われている』状態になってる
大元がどこかは分かるだろ
287Name_Not_Found:2015/02/19(木) 09:28:11.26 ID:???
fill,stroke,closePathが不要なのはfillRect,strokeRect,clearRectだけだね
288Name_Not_Found:2015/02/19(木) 10:03:16.78 ID:???
ベクターグラフィックシステムの設計の根底にタートルグラフィックの考え方があります
この辺も読んでおくとよいでしょう
https://msdn.microsoft.com/ja-jp/library/gg193983(v=vs.85).aspx
289Name_Not_Found:2015/02/19(木) 12:25:47.01 ID:???
左○を白と黒のグラデーションにして、右○を赤と黒のグラデーションにしたいんですが
左○が赤と黒になってしまいまして、右○のグラデーションが効いてない状態になりました
http://jsfiddle.net/cq2nLqhy/

どう直したらいいのか教えて下さい
290Name_Not_Found:2015/02/19(木) 12:52:03.15 ID:???
>>289
上の方でちょっと話題になってるのと関連するけど、
beginPathが無いのとfillが1度だけしか呼ばれてないから1つの図形
と見なされてる
291Name_Not_Found:2015/02/19(木) 13:06:35.12 ID:???
それと話題それるけどそのサイトいいね
ログインしなくても投稿できるのか
292Name_Not_Found:2015/02/19(木) 13:20:56.56 ID:???
こうですか?左○のグラデーションが効くようになったんですけど右○は相変わらずグラデーションが効きません
あとパフォーマンスの観点からfillを一度だけ呼びたいんですけど無理なんでしょうか?
http://jsfiddle.net/cq2nLqhy/3/
293Name_Not_Found:2015/02/19(木) 13:31:35.57 ID:???
createRadialGradientの座標がどちらも一緒になってるよ
下は
var crg2 = ctx.createRadialGradient(150, 50, 10, 150, 50, 100);
かな?
あとfillでパスは閉じるのでclosePathは不要
294Name_Not_Found:2015/02/19(木) 13:38:29.79 ID:???
あ、あと円グラデーションの終了点がかなり外側だから黒になり切らないね
100じゃなくて50じゃ?
var crg2 = ctx.createRadialGradient(150, 50, 10, 150, 50, 50);
295Name_Not_Found:2015/02/19(木) 14:01:04.90 ID:???
アドバイス受けて修正したら今度は右○は効くようになったのに左○が効かなくなりました
http://jsfiddle.net/cq2nLqhy/4/
296Name_Not_Found:2015/02/19(木) 14:11:46.21 ID:???
いやだからbeginPathは要るんだってばw
http://jsfiddle.net/gLbd0frh/1/

対照性が悪いみたいでスッキリしないと思うけど
297Name_Not_Found:2015/02/19(木) 15:16:42.67 ID:???
なるほど、勉強になりました
グラデーションをつかうと一つずつ描画しないといけないのが難点ですね
298Name_Not_Found:2015/02/20(金) 17:44:11.41 ID:???
rotateで複数のグラフィックをそれぞれ中心で回転したい場合ってその数だけcanvas要素を作らないとだめですか?
http://tech.kayac.com/archive/canvas-tutorial.htmlの長方形が回転するサンプルのtranslate,rotate ,translateの後にfillRectを複数並べると
惑星が回るようになってしまいました
風車みたいなものをつくりたいんですが
http://jsdo.it/shitman/sDTZのサンプルではcanvas要素を複数用意してたのでやっぱり複数要素作らないだめですか
299Name_Not_Found:2015/02/20(金) 18:42:35.34 ID:???
よくわからん。
1つのオブジェクトのパスを指定して変換かけて描画する。
の繰り返しでいいだけじゃん?
300Name_Not_Found:2015/02/20(金) 19:09:15.65 ID:???
>>298
save()
translate() rotate() translate()
fillRect()
restore()
translate() rotate() translate()
fillRect()
restore()
以下繰り返し
でしょ
当然rotateや2回目のtranslateの中身は変えないと全部重なるだけだが
301Name_Not_Found:2015/02/20(金) 22:59:29.39 ID:???
多分そんな感じで作ったんですが最初から作りなおしたらできました。
なんで最初のが動かなかったのか原因は分かりません。
ありがとうございます
302Name_Not_Found:2015/02/20(金) 23:26:44.32 ID:???
translateで横に100ずらしたいのに、何故かxとyの分だけ余計にずれてます
http://jsfiddle.net/0fs1dhfj/
座標10:10に100x100の正方形を描画して、右方向に100ずらした位置に正方形を描画したいんですが
これ、正方形と正方形の間にスペースが空いてしまいます。
どうしてこうなるんでしょうか?
303Name_Not_Found:2015/02/20(金) 23:35:20.08 ID:???
>>302
いや、10ずつ足してるじゃん・・・
304Name_Not_Found:2015/02/20(金) 23:44:36.73 ID:???
理解できました
translateで移動した位置が座標0:0となるんですね
305Name_Not_Found:2015/02/21(土) 10:17:56.11 ID:???
transformって歴史的な理由で残されてるってw3cに書いてあったけどその歴史的な理由知ってる?
306Name_Not_Found:2015/02/22(日) 20:23:32.30 ID:???
それを語るなら秦の始皇帝まで遡る事になるが良いかな?
307Name_Not_Found:2015/02/22(日) 20:52:38.66 ID:???
canvas自体そんなに歴史があるわけじゃないのに何だろうね?

アフィン変換、行列変換の事を言ってるんだろうか?

Most of the API uses SVGMatrix objects rather than this API. This API remains mostly for historical reasons.

(”APIのほとんどは、SVGMatrixは、このAPIのではなく、オブジェクトを使用します。このAPIは、歴史的な理由のために主に残る。”)

確かにtranseformメソッドを呼ぶよりscale,rotate,translateメソッドをそれぞれ呼んだほうが扱いやすい気がする
308Name_Not_Found
cssにはskewが実装されてるのにcanvasには実装されてない
中途半端なのがtransformである
奥行きをつけるのにcssからなら楽勝だがcanvasでやると知識がないと無理