gpt4 book ai didi

html - 小数字体大小 html5 Canvas ?

转载 作者:太空狗 更新时间:2023-10-29 13:14:59 26 4
gpt4 key购买 nike

我对不同浏览器如何在 HTML5 Canvas 上呈现字体大小有疑问。特别是字体大小不是整数的地方。例如“8.5px 宋体”、“2.23em 宋体”等。

for canvas.font=FontSize + "px Arial";其中 FontSize 是 (8.1, 8.2, 8.3, ...) 我希望得到一个线性结果,但是唯一一致存档的浏览器是 IE ! ( 我知道 )。 Firefox 在 11.2px 以下四舍五入,但超过 11.2px 是线性的。 Chrome 和 Safari 仅将字体缩放为整数值。

舍入规则似乎设置为像素并向下舍入到最接近的小于 .5 的整数

我的 Canvas 应用程序正在执行一些程序化的动画转换(缩放和平移)试图避免 Canvas 转换以提高效率,虽然我怀疑它会解决问题,但我也没有通过设置 html 文本大小来测试这个CSS3(根据规范,Canvas.font 应该基于)

浏览器至少在 pt、px、em 和 % 字体大小之间的行为是一致的。 [编辑:除了 Safari 不呈现 % 大小]

[ 旁白:所有字体一旦放大一点,就会显得有点粗体。当我们从 17.4px 到 17.5px 时,Safari 接管了这 block 蛋糕.. BAMB!]

我在下面附上了一些示例图片,但我真的很想知道如何让所有浏览器更像 IE 的一些想法(再一次没想过我会这么说)- 这是一个错误还是渲染字体的标准?

这是我的测试代码,可以针对 PX 字体大小情况进行复制。

<!DOCTYPE html><html><head><script>
function display() {
var canvas = document.getElementById('test');
// For EM and % cases....
//canvas.style.font="5px Arial";
canvas.height = 1000;
var context = canvas.getContext('2d');
var minSize = 10;
var lineHeight = 100;
for(var a=minSize; a< 20; a+=0.1)
{
var font_size = Math.round(a*10000)/10000;
context.font = a + "px Arial";
context.fillText("A: EXAMPLE TEXT > " + font_size, 20, (font_size-minSize)*lineHeight);
}
}
</script></head><body onload="display()"><canvas id="test"></canvas></body></html>

像素比例 pixel scale点刻度 point scaleem 比例 - 1em = 5px Arial em scale百分比比例 - 100% = 5px Arial percent scale

最佳答案

我认为你们很多人应该为我做我的工作 ;) 不管怎样,这就是我解决问题的方法,虽然它有点乱,但仍然有一些我将描述的问题。

回顾一下(因为问题可能不清楚)我正在尝试将字体大小乘以一些 float 来放大和缩小文本。但这导致了不稳定的结果,因为大多数字体大小都四舍五入到最接近的整数值。

例如。

var zoom = 1.02;
var font_size = 12;
context.font = (font_size * zoom) + "px Arial"; // 12.24px

zoom = 1.04 (12.48px) 将呈现与上述代码相同的效果,而 zoom =1.06 (12.75px) 将四舍五入为 13px。

这导致值之间的字体大小发生非常不希望的跳跃,而 Canvas 上的所有其他元素都正确缩放。

所有浏览器都呈现给定的文本字符串(如“EXAMPLE TEXT”)并且长度略有不同,这一事实使问题变得更加复杂。

解决方案

在初始化期间以标准字体大小(zoom=1)呈现文本并测量线长,将此值称为iniLineLength

在场景渲染期间,我使用隐藏 Canvas 将文本渲染到主 Canvas 上,然后将 drawImage 用于宽度倍增的主 Canvas 。

tmpContext.font = (font_size * zoom) + "px Arial";
tmpContext.fillText(MyLineOfText,0, 0);
var s = (iniLineLength * zoom) / tmpContext.measureText(MyLineOfText) ;
mainContext.drawImage(tmpCanvas,x, y, pw * s, ph);

生成的文本行根据行长度与预期行长度的偏离程度在主 Canvas 上拉伸(stretch)或收缩。

在理想世界中,s 始终等于 1,因为预期的行长度始终与实际行长度相同。预期的行长度是我们的样本行长度 iniLineLength 乘以我们的字体大小在这个渲染过程中的相同缩放因子。

所有这一切的好处是它具有规范化浏览器行为中所有差异的效果……几乎。

问题

即使将行长度归一化,行中每个字符的确切位置也不相同。给出下图中的效果。

enter image description here

然而,这已经是我所拥有的巨大改进。

此外,您需要将 tmpCanvas 剪辑到 mainCanvas,否则您的浏览器会在尝试创建和复制百万像素的文本时逐渐停止,只是为了让一个字符全屏显示.

考虑到这一点,您还可以根据需要设置 tmp Canvas 宽度和高度,以适应您要呈现的实际文本行,这将节省内存、时间等。

关于html - 小数字体大小 html5 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com