数年前、私はAPNGedit用のJavascriptスクリプトを作成して、LaughingManのロゴを描画しました。現在は機能していないmozTextAlongPathを使用しました
最近、このスクリプトを再発見し、translations、rotations、fillText()を使用して再作成しました。ただし、これは文字幅を尊重せず、カーニングもされません(ひどいように見えます)。
2009年頃のオリジナル(完璧ではありませんが、大丈夫です):
現行版:
HTML5キャンバス上に円弧状にテキストを描画して見栄えを良くするにはどうすればよいですか?
Kolinkの回答に基づくソリューションコード:
ctx.fillStyle = primaryColor;
ctx.font = fontSize + 'px ' + fontFamily;
var textWidth = ctx.measureText(text).width,
charRotation = 0,
character, charWidth, nextChar, nextWidth, bothWidth, kern, extraRotation, charSegment;
for (var i=0, l=text.length; i<l; i++) {
character = nextChar || text[i];
charWidth = nextWidth || ctx.measureText(character).width;
// Rotate so the letter base makes a circle segment instead of a tangent
extraRotation = (Math.PI/2) - Math.acos((charWidth/2) / radius);
ctx.save();
ctx.translate(radius, h/2);
ctx.rotate(charRotation);
ctx.translate(0, -textRadius);
ctx.rotate(extraRotation);
ctx.fillText(character,0,0);
ctx.restore();
nextChar = text[i+1] || '';
nextWidth = ctx.measureText(nextChar).width;
bothWidth = ctx.measureText(character+nextChar).width;
kern = bothWidth - charWidth - nextWidth;
charSegment = (charWidth+kern) / textWidth; // percent of total text size this takes up
charRotation += charSegment * (Math.PI*2);
}