【发布时间】:2016-02-20 01:00:51
【问题描述】:
在我的即时编辑器工具中,我真的很高兴获得文本/字体的实际渲染高度 - (我的意思不是仅仅获得 CSS 字体大小,既不计算也不预设)。
这可以在 javascript 中实现吗?
如果不是直接的,是否可以在画布中以与呈现为常规文本相同的方式呈现字体 - 然后找出?
编辑 - 我的“开发”解决方案:基于建议的链接,我构建了一个纯 JavaScript 代码,它通过画布中的像素并分析像素是否为白色并起作用因此,它几乎不是代码的开发者版本 - 只是输出一些有用的信息并显示如何访问计算数据 - http://jsfiddle.net/DV9Bw/1325/
HTML:
<canvas id="exampleSomePrettyRandomness" width="200" height="60"></canvas>
<div id="statusSomePrettyRandomness"></div>
JS:
function findPos(obj) {
var curleft = 0, curtop = 0;
if (obj.offsetParent) {
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return { x: curleft, y: curtop };
}
return undefined;
}
var status = document.getElementById('statusSomePrettyRandomness');
var example = document.getElementById('exampleSomePrettyRandomness');
var context = example.getContext('2d');
context.fillStyle = "rgb(255,255,255)";
context.fillRect(0, 0, 200, 200);
context.fillStyle = "rgb(0,0,0)";
context.font = "30px Arial";
context.fillText("Hello World",0,30);
var pos = findPos(example);
var x = example.pageX - pos.x;
var y = example.pageY - pos.y;
var foundTop = false;
xPos = 0;
yPos = 0;
topY = -1;
bottomY = -1;
var fuse = 1000;
while( fuse-- > 0 ){
//status.innerHTML += yPos+"<br>";
if( yPos == (example.offsetHeight - 2) ){
xPos++;
yPos = 0;
continue;
}
var data = context.getImageData(xPos, yPos, 1, 1).data;
if( ! foundTop ){
if( (data[0] != 255) && (data[1] != 255) && (data[2] != 255) ){
topY = yPos;
status.innerHTML += "<br>Found top: "+topY+" X:"+xPos+" Color: rgba("+data[0]+","+data[1]+","+data[2]+")"+"<br>";
foundTop = true;
}
} else {
if( (data[0] == 255) && (data[1] == 255) && (data[2] == 255) ){
bottomY = yPos;
status.innerHTML += "<br>Found bottom: "+bottomY+" X:"+xPos+"<br>";
break;
}
}
yPos++;
if( yPos > example.offsetHeight ){
status.innerHTML += ""
+"Y overflow ("+yPos+">"+example.offsetHeight+")"
+" - moving X to "+xPos
+" - reseting Y to "+yPos
+"<br>"
;
xPos++;
yPos = 0;
}
}
status.innerHTML += "Fuse:"+fuse+", Top:"+topY+", Bottom: "+bottomY+"<br>";
status.innerHTML += "Font height should be: "+(bottomY-topY)+"<br>";
编辑 2: 为什么这不是重复的:我的问题是关于字体或字母的真实渲染高度,“possible duplicate”是关于你需要多少空间打印文本,提供的答案无论如何都不能回答我的确切问题。
【问题讨论】:
-
我不确定我是否完全明白了你的问题,我很着急,但既然你标记了你的问题 [html5-canvas] 也许this question 它的答案可以帮助你。
-
我标记了它,因为我猜可能有一个解决方案,可以以与呈现为文本相同的方式绘制字体 - 但在画布中,作为图像像素 - 然后我想我可以以某种方式分析画布像素,因为我知道底色是什么,淹没字体的颜色是什么 :) 现在更清楚了吗?
-
也许试试这种方法? stackoverflow.com/questions/1134586/…
-
"获取文本/字体的实际渲染高度"应该返回哪个度量单位?
-
@jave.web 试过
window.getComputedStyle?
标签: javascript html5-canvas font-size text-size