他にも言及したように、これは直接測定することはできません。キャンバスに手紙を描き、どのピクセルが塗りつぶされているかを判断することができます。
ここにはdemo that does thisがあります。この機能は、次のとおりです。
/**
* Draws a letter in the given font to an off-screen canvas and returns its
* size as a {w, h, descenderH} object.
* Results are cached.
*/
function measureLetter(letter, fontStyle) {
var cacheKey = letter + ' ' + fontStyle;
var cache = measureLetter.cache;
if (!cache) {
measureLetter.cache = cache = {};
}
var v = cache[cacheKey];
if (v) return v;
// Create a reasonably large off-screen <canvas>
var cnv = document.createElement('canvas');
cnv.width = '200';
cnv.height = '200';
// Draw the letter
var ctx = cnv.getContext('2d');
ctx.fillStyle = 'black';
ctx.font = fontStyle;
ctx.fillText(letter, 0.5, 100.5);
// See which pixels have been filled
var px = ctx.getImageData(0, 0, 200, 200).data;
var minX = 200, minY = 200, maxX = 0, maxY = 0;
var nonZero = 0;
for (var x = 0; x < 200; x++) {
for (var y = 0; y < 200; y++) {
var i = 4 * (x + 200 * y);
var c = px[i] + px[i + 1] + px[i + 2] + px[i + 3];
if (c === 0) continue;
nonZero++;
minX = Math.min(x, minX);
minY = Math.min(y, minY);
maxX = Math.max(x, maxX);
maxY = Math.max(y, maxY);
}
}
var o = {w: maxX - minX, h: maxY - minY, descenderH: maxY - 100};
cache[cacheKey] = o;
return o;
}
これはアンチエイリアスに対して敏感であることに注意してください。結果はピクセルによって外れることがあります。
この例では、フォントサイズを53ptsに設定します。なぜそれが画面上で異なるのでしょうか? –
@Larry K、すべてのフォントがモノスペースではありません。文字「i」は、フォントファミリ、タイプ、カーニング及びその他の要因に応じて、文字「w」とは異なる境界矩形を決定する。 –
あなたはどんな問題を解決しようとしていますか? – egrunin