
html5でcanvasを使用した場合に赤い背景に文字の形に透明くり抜きを行いたいです。
ctx.fillStyle = "rgb(200, 0, 0)";
ctx.fillRect(0, 0, 100, 100);
ctx.clearRect(20, 30, 60, 40); ★ここがRectでなく文字の切り抜きにしたい。
イメージ的にはclearText()というのがあればいいのになぁ、という感じです。
パスをmoveToで文字の形にうごかして、clipしなさーい
という回答はご勘弁を(^^;)
No.3ベストアンサー
- 回答日時:
.globalCompositeOperationを使ってみてください。
<script>
//前略
ctx.fillStyle = "rgb(200, 0, 0)";
ctx.fillRect(0, 0, 100, 100);
//マスキング(?)してテキスト描画
ctx.globalCompositeOperation='destination-out';
ctx.fillText('Hello world', 20, 30);
ctx.globalCompositeOperation='source-over'; //マスクを戻す
ctx.clearRect( 50, 50, 10, 10);//透過確認用
//後略
</script>
<p style="background-color:blue;">canvasを透過して背景が見える
<canvas id="mycanvas"></canvas>
</p>
シャギーや半透明を細かく制御したいなら、ブラウザに任せるのではなくNo.1のような方法で自分で作らないとダメだと思います。
>パスをmoveToで文字の形にうごかして、clipしなさーい
ある意味そういうことになりますが。(幅1px長さ1pxのパスを1つずつ処理していると考えて)
まさにやりたい通りのことができました!!
globalCompositeOperationですかぁ~
勉強するようにします!!o(`・д・´)o
No.2
- 回答日時:
>パスをmoveToで文字の形にうごかして、clipしなさーい
それが本来の方法であることはご理解されているようです。
inkscapeなどで画像をトレースしたり、直接SVGにするのが良いと思いますけど・・・
SVGからHTML5のcanvasにコンバートする
Ink2canvas, a new SVG to HTML5 Canvas converter | Libre Graphics World ( http://libregraphicsworld.org/blog/entry/ink2can … )
もあります。
No.1
- 回答日時:
canvasは使ったことがほとんどありませんが、単純に背景色と文字色とで構成されているものなら、描いた後でcanvasを走査して、色によって透明にするという案ではどうでしょうか?
参考にしたサイト
http://www.html5.jp/canvas/index.html
(全角空白は半角に)
<!DOCTYPE HTML>
<html lang="ja">
<head>
<title>sample</title>
</head>
<body>
<canvas id="canvas" width="500" height="300"></canvas>
<script>
var canvas = document.getElementById("canvas");
if(canvas && canvas.getContext){
var ctx = canvas.getContext("2d");
testDraw();
transparent(0, 100, 260, 120);
}
//矩形と文字を書いてみる
function testDraw(){
ctx.fillStyle = "rgb(200, 0, 0)";
ctx.fillRect(0, 0, 500, 300);
ctx.font = "100px 'MS Pゴシック'";
ctx.fillStyle = "rgb(0, 0, 0)";
ctx.fillText("テストText", 20, 200);
}
//矩形範囲を指定:(背景色以外の色を透明にする)
//
// 指定色だけ透明にしてみたら、エッジの中間色が残るようだ
// それなので、背景色以外は透明に→エッジが少々ジャギる
// エッジを半透明にするとか滑らかにするのは適当に修正してちょ
function transparent(x, y, w, h){
var imageData = ctx.getImageData(x, y, w, h);
var d = imageData.data, i;
for(i=0; i<d.length; i+=4)
if(d[i]!=200 || d[i+1]!=0 || d[i+2]!=0) d[i+3] = 0;
ctx.putImageData(imageData, x, y);
}
</script>
</body>
</html>
ご指定の方法でうまくいきました(p゜∀゜q)
今回はNo3さんの方法でやってみますが、この方法もその内役立たせていただきますm(。v_v。)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタイルシートで画面を上下に...
-
css固定したフッターが本文と重...
-
リンクで違うページの指定箇所...
-
textareaで入力した文字を改行...
-
1行で左寄せと右寄せと中央揃え...
-
floatさせたdivタグを折り返さ...
-
JSPでの画像ファイル表示
-
jspでcssが読み込めない
-
javascriptテキストBOX色を元に...
-
ボタンを押すたびに交互に切り...
-
libjpegライブラリの使い方につ...
-
1枚の画像をクリックすると複数...
-
UWSC(マウス自動化ソフト)に...
-
クリックした自身の画像を別画...
-
リンク色を動的に変更したい。i...
-
スマートな外部javaでロールオ...
-
リンク先を動的に変更する
-
MAX関数を使ってからLEFT JOIN...
-
jqueryで要素の中身を要素の外...
-
クリックするとテーブルの列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スクロール可能なチェックボックス
-
背景画像
-
困っています!!
-
CSS <div>の入れ子が反映さ...
-
Ctrl+F(検索)の窓を出したいの...
-
SeesaaブログにBlogPeople (...
-
背景画像がつられてのびていく...
-
オンマウス時に別画像を上に重...
-
floatさせたdivタグを折り返さ...
-
リンクで違うページの指定箇所...
-
CSSで親ボックスの背景画像を設...
-
【CSS】floatで左右に並べた...
-
マウスオーバーのメニューについて
-
HP作成/広告表示について
-
CSSでテキストの均等割付
-
離れた場所にマウスオーバーで...
-
CSSでdivのheightを動的に
-
FC2カテゴリ親文字だけ大きく、...
-
CSSでdivの縦幅を指定する方法
-
スタイルシートで画面を上下に...
おすすめ情報